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

编写TSQL存储过程:将单表指定行转换为键值对表

完成后的TSQL存储过程实现

以下是重新设计后的存储过程,可实现将指定表中Id匹配的行转换为键值对表的需求:

CREATE PROCEDURE [dbo].[spConvertToKeyValuePairs]
    @tableName VARCHAR(MAX),
    @id INT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @dynamicSql NVARCHAR(MAX);
    DECLARE @columnsSql NVARCHAR(MAX);

    -- 动态生成将每一列转为键值对的UNION ALL语句
    SELECT @columnsSql = STRING_AGG(
        CONCAT(
            'SELECT ''', COLUMN_NAME, ''' AS ColumnName, CAST(', QUOTENAME(COLUMN_NAME), ' AS VARCHAR(MAX)) AS ColumnValue FROM ', QUOTENAME(@tableName), ' WHERE Id = @id'
        ),
        ' UNION ALL '
    )
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @tableName;

    -- 拼接并执行完整的动态SQL
    SET @dynamicSql = @columnsSql;
    EXEC sp_executesql @dynamicSql, N'@id INT', @id = @id;
END
GO

关键说明

  • 动态SQL适配动态表名:因为表名是传入的参数,静态SQL无法直接引用,必须通过动态SQL构建查询逻辑
  • 统一值类型:通过CAST(列名 AS VARCHAR(MAX))将所有数据类型的列值转为字符串,保证ColumnValue列的输出类型一致
  • 单行转多行键值对:利用STRING_AGG拼接UNION ALL语句,把目标行的每一列拆分为独立的键值对行
  • 参数化过滤:通过sp_executesql传入@id参数,确保过滤条件的参数化处理

示例用法

执行以下语句即可获取Person表中Id为2的行的键值对:

EXEC spConvertToKeyValuePairs 'Person', 2;

返回结果示例:

ColumnNameColumnValue
Id2
NameJohn Doe
Age30
Emailjohn@example.com

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:55:17