SQL Server 2019动态拼接每行列名与值为单字符串的方案问询
SQL Server 2019 动态生成行拼接字符串方案
方案说明
本方案完全适配动态表、自定义分隔符需求,自动处理NULL值输出为NULL字符串、自动兼容数值/字符串等不同数据类型转换。
1. 基础测试环境(与你提供的结构一致)
CREATE TABLE myTable ( COL1 int, COL2 varchar(10), COL3 float ) INSERT INTO myTable VALUES (1, 'c2r1', NULL), (2, 'c2r2', 2.335)
2. 单次使用动态脚本
可直接修改参数适配不同表、不同分隔符:
DECLARE @TableName SYSNAME = 'myTable', -- 自定义要查询的表名 @Separator VARCHAR(10) = '|', -- 自定义列之间的分隔符 @Sql NVARCHAR(MAX) -- 动态拼接所有列的转换逻辑 SELECT @Sql = COALESCE(@Sql + ' + ''' + @Separator + ''' + ', '') + '''' + c.name + '='' + ISNULL(CAST(' + QUOTENAME(c.name) + ' AS VARCHAR(MAX)), ''NULL'')' FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id WHERE t.name = @TableName ORDER BY c.column_id -- 拼接最终查询语句 SET @Sql = 'SELECT ' + @Sql + ' AS line_str FROM ' + QUOTENAME(@TableName) -- 执行动态SQL EXEC sp_executesql @Sql
3. 复用型存储过程封装
如果需要频繁调用,可以封装为存储过程,直接传参数即可:
CREATE OR ALTER PROC GetTableLineStr @TableName SYSNAME, @Separator VARCHAR(10) = '|' -- 默认分隔符为| AS BEGIN SET NOCOUNT ON; DECLARE @Sql NVARCHAR(MAX) SELECT @Sql = COALESCE(@Sql + ' + ''' + @Separator + ''' + ', '') + '''' + c.name + '='' + ISNULL(CAST(' + QUOTENAME(c.name) + ' AS VARCHAR(MAX)), ''NULL'')' FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id WHERE t.name = @TableName ORDER BY c.column_id SET @Sql = 'SELECT ' + @Sql + ' AS line_str FROM ' + QUOTENAME(@TableName) EXEC sp_executesql @Sql END GO -- 调用示例 EXEC GetTableLineStr @TableName = 'myTable', @Separator = '|'
输出结果
和你期望的输出一致:
COL1=1|COL2=c2r1|COL3=NULL COL1=2|COL2=c2r2|COL3=2.335
注意事项
- 如果表属于非默认架构,可自行修改脚本增加
@SchemaName参数,在查询sys.tables时增加schema过滤条件 - 如果需要处理超长字符串或中文字符,可将
VARCHAR(MAX)替换为NVARCHAR(MAX)避免乱码或截断
内容的提问来源于stack exchange,提问作者gilberke
相关产品推荐
相关产品推荐

