You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TSQL中如何获取已声明表变量的主键字段名称

TSQL获取表变量主键字段的实现方法

实现原理

表变量的元数据实际存储在tempdb的系统视图中,和临时表的存储位置类似,只是表变量的命名格式为#加8位十六进制字符,且仅在当前会话、当前批处理中可见。

可直接运行的示例代码

示例1:查询单字段主键的表变量

-- 声明测试用表变量
DECLARE @Table1 TABLE (id INT PRIMARY KEY)

-- 主键查询语句
SELECT 
    col.name AS PrimaryKeyColumnName
FROM 
    tempdb.sys.tables t
INNER JOIN 
    tempdb.sys.indexes idx 
    ON t.object_id = idx.object_id 
    AND idx.is_primary_key = 1
INNER JOIN 
    tempdb.sys.index_columns idx_col 
    ON idx.object_id = idx_col.object_id 
    AND idx.index_id = idx_col.index_id
INNER JOIN 
    tempdb.sys.columns col 
    ON idx_col.object_id = col.object_id 
    AND idx_col.column_id = col.column_id
WHERE 
    -- 匹配表变量的命名格式
    t.name LIKE '#[0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]'
    -- 取当前会话最新创建的表变量
    AND t.object_id = (
        SELECT MAX(object_id) 
        FROM tempdb.sys.tables 
        WHERE name LIKE '#[0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]'
    )
ORDER BY 
    -- 联合主键按定义的顺序返回
    idx_col.key_ordinal

运行后返回结果为:id

示例2:查询联合主键的表变量

-- 声明联合主键测试表变量
DECLARE @Table2 TABLE (id1 INT, id2 INT, id3 INT, PRIMARY KEY(id1, id2, id3))

-- 主键查询语句和上面完全一致
SELECT 
    col.name AS PrimaryKeyColumnName
FROM 
    tempdb.sys.tables t
INNER JOIN 
    tempdb.sys.indexes idx 
    ON t.object_id = idx.object_id 
    AND idx.is_primary_key = 1
INNER JOIN 
    tempdb.sys.index_columns idx_col 
    ON idx.object_id = idx_col.object_id 
    AND idx.index_id = idx_col.index_id
INNER JOIN 
    tempdb.sys.columns col 
    ON idx_col.object_id = col.object_id 
    AND idx_col.column_id = col.column_id
WHERE 
    t.name LIKE '#[0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]'
    AND t.object_id = (
        SELECT MAX(object_id) 
        FROM tempdb.sys.tables 
        WHERE name LIKE '#[0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]'
    )
ORDER BY 
    idx_col.key_ordinal

运行后按顺序返回结果:id1、id2、id3

注意事项

  • 查询必须和表变量的声明放在同一个批处理中运行,批处理结束后表变量的元数据会被自动清理,无法再查询到。
  • 如果同一批处理中声明了多个表变量,需要在WHERE条件中补充字段数量、字段名、字段类型等过滤条件,精准匹配目标表变量即可。

内容的提问来源于stack exchange,提问作者user9947392

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:45:07