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

如何将SQL表字段名与对应值转换为键值对形式?

嘿,你这个需求本质上就是宽表逆透视(Unpivot),把横向的列转换成纵向的字段名-值对。我给你两种实用方案,分别适配列固定和列动态的场景:

方案一:列名固定时(静态列)

如果你的表结构固定,列名不会随意变动,用下面两种方法都可以:

方法1:使用UNPIVOT关键字(推荐)

SQL Server原生支持UNPIVOT语法,可以快速把指定列转成键值对:

SELECT FieldName, FieldValue
FROM MyTable
UNPIVOT (
    FieldValue FOR FieldName IN (Field1, Field2, Field3) -- 这里列出所有要转换的列
) AS Unpvt;

注意:FieldValue的类型必须统一,如果原表中不同数值列的类型不一致(比如一个是int,一个是decimal),需要先把它们转成相同类型,比如用CAST(Field1 AS DECIMAL(18,2))替换原列名。

方法2:使用UNION ALL(更直观,适合列少的情况)

如果觉得UNPIVOT不好理解,也可以用UNION ALL手动拼接每一列的结果:

SELECT 'Field1' AS FieldName, Field1 AS FieldValue FROM MyTable
UNION ALL
SELECT 'Field2' AS FieldName, Field2 AS FieldValue FROM MyTable
UNION ALL
SELECT 'Field3' AS FieldName, Field3 AS FieldValue FROM MyTable;

这种写法虽然繁琐,但逻辑清晰,新手更容易调试。

方案二:列名动态时(自动适配所有数值列)

如果你的表列可能会新增/删除,或者不确定具体列名,就需要结合你提到的sys.columns来生成动态SQL,自动获取所有数值类型的列并转换:

DECLARE @colsUnpivot NVARCHAR(MAX), @query NVARCHAR(MAX);

-- 第一步:从系统视图中获取所有数值类型的列名(过滤非数值列,保证FieldValue是数值类型)
SELECT @colsUnpivot = STUFF(
    (SELECT ',' + QUOTENAME(name)
     FROM sys.columns
     WHERE object_id = OBJECT_ID('schema.MyTable') -- 替换成你的表名(含架构)
       AND system_type_id IN (4,5,6,106,108,122,127) -- 对应SQL Server的数值类型:int、smallint、tinyint、decimal、numeric、money、bigint
     FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

-- 第二步:生成动态UNPIVOT语句
SET @query = '
SELECT FieldName, FieldValue
FROM schema.MyTable
UNPIVOT (
    FieldValue FOR FieldName IN (' + @colsUnpivot + ')
) AS Unpvt;';

-- 第三步:执行动态SQL
EXEC sp_executesql @query;

关键说明:

  • 我们通过system_type_id过滤出数值类型的列,避免把字符串、日期等非数值列混入FieldValue;
  • QUOTENAME用来处理列名含特殊字符的情况;
  • STUFF是为了去掉列名列表开头的逗号;
  • 如果需要兼容不同数值类型,可以在动态SQL里给每个列加上CAST,比如把QUOTENAME(name)改成CAST(' + QUOTENAME(name) + ' AS DECIMAL(18,2)) AS ' + QUOTENAME(name)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:31:56