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

如何在SQL Server中按ID展示列名与对应列值?

实现SQL Server行转键值对的查询方案

针对你需要根据指定Id将行数据转换为列名-值键值对的需求,提供两种可行方案:

静态方案(列固定时使用)

如果表的列结构不会变动,直接用UNION ALL就能快速实现,写法直观且性能稳定:

-- 指定要转换的Id,这里以Id=1为例
SELECT 'address1' AS item, address1 AS value FROM @tab1 WHERE Id = 1
UNION ALL
SELECT 'city' AS item, city AS value FROM @tab1 WHERE Id = 1
UNION ALL
SELECT 'name' AS item, name AS value FROM @tab1 WHERE Id = 1
UNION ALL
SELECT 'phone' AS item, phone AS value FROM @tab1 WHERE Id = 1
-- 可选:按原列顺序排序
ORDER BY 
    CASE item 
        WHEN 'address1' THEN 1
        WHEN 'city' THEN 2
        WHEN 'name' THEN 3
        WHEN 'phone' THEN 4
    END;

如果想用UNPIVOT语法,也可以这样写:

SELECT item, value
FROM (
    SELECT 
        'address1' AS item1, CAST(address1 AS VARCHAR(200)) AS value1,
        'city' AS item2, CAST(city AS VARCHAR(200)) AS value2,
        'name' AS item3, CAST(name AS VARCHAR(200)) AS value3,
        'phone' AS item4, CAST(phone AS VARCHAR(200)) AS value4
    FROM @tab1
    WHERE Id = 1
) t
UNPIVOT (value FOR val_col IN (value1, value2, value3, value4)) up_val
UNPIVOT (item FOR item_col IN (item1, item2, item3, item4)) up_item
-- 匹配对应的列名和值
WHERE RIGHT(item_col, 1) = RIGHT(val_col, 1)
ORDER BY 
    CASE item 
        WHEN 'address1' THEN 1
        WHEN 'city' THEN 2
        WHEN 'name' THEN 3
        WHEN 'phone' THEN 4
    END;

动态方案(列可能变动时使用)

如果表的列结构可能变化,用动态SQL自动生成查询语句,无需硬编码列名:

DECLARE @TargetId INT = 1; -- 指定要转换的Id
DECLARE @DynamicSql NVARCHAR(MAX);

-- 自动拼接列对应的查询语句
SELECT @DynamicSql = STRING_AGG(
    CONCAT('SELECT ''', COLUMN_NAME, ''' AS item, CAST(', COLUMN_NAME, ' AS VARCHAR(200)) AS value FROM @tab1 WHERE Id = ', @TargetId),
    ' UNION ALL '
)
FROM INFORMATION_SCHEMA.COLUMNS
-- 注意:如果是实体表,直接写表名;如果是表变量,需要调整获取列的方式
WHERE TABLE_NAME = 'YourActualTableName' 
    AND COLUMN_NAME NOT IN ('Id'); -- 排除Id列

-- 执行动态SQL,如果是表变量,需要传递表变量定义
EXEC sp_executesql @DynamicSql, 
    N'@tab1 table(Id int, address1 varchar(100), city varchar(50), name varchar(50), phone varchar(10))', 
    @tab1 = @tab1;

提示:如果是实体表而非表变量,动态SQL的写法会更简单,不需要传递表变量参数,直接替换@tab1为实体表名即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:12:38