编写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;
返回结果示例:
| ColumnName | ColumnValue |
|---|---|
| Id | 2 |
| Name | John Doe |
| Age | 30 |
| john@example.com |
内容的提问来源于stack exchange,提问作者Monset
相关产品推荐
相关产品推荐

