SQL SSMS中如何按行拼接非空列并避免生成空行?
SQL Server SSMS中实现列按行拼接(空字段不生成空行)
问题说明
需要将date类型字段a、int类型字段b、varchar类型字段c按行拼接,空字段不生成对应空行,且每条记录之间用空行分隔。此前尝试单独使用CHAR(13)在SSMS 19.0.1中无效。
解决方案
SSMS中正确识别的换行符是回车+换行组合(CHAR(13)+CHAR(10)),单独CHAR(13)无法触发换行显示。同时需要处理空字段,避免生成多余空行,最终用STRING_AGG实现记录间的空行分隔。
核心SQL语句
SELECT STRING_AGG( CONCAT( -- 处理date类型字段a,转换为标准格式,空值则返回空字符串 ISNULL(CONVERT(VARCHAR(10), a, 23), ''), -- 非空字段后添加换行符 CASE WHEN a IS NOT NULL THEN CHAR(13)+CHAR(10) ELSE '' END, -- 处理int类型字段b,先转字符串再处理空值 ISNULL(CONVERT(VARCHAR(10), b), ''), CASE WHEN b IS NOT NULL THEN CHAR(13)+CHAR(10) ELSE '' END, -- 处理varchar类型字段c ISNULL(c, '') ), -- 记录之间添加空行(两个换行符) CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10) ) AS 拼接结果 FROM 你的表名;
关键细节说明
- 字段类型转换:date和int类型必须先转换为varchar,才能参与字符串拼接。
CONVERT(VARCHAR(10), a, 23)确保date类型输出YYYY-MM-DD格式。 - 空值处理:用
ISNULL将空值转为空字符串,配合CASE语句,仅在字段非空时添加换行符,避免空字段生成空行。 - SSMS显示设置:查询结果需切换为文本格式(快捷键
Ctrl+T),网格格式无法正确渲染换行符。
测试示例
先创建测试表并插入示例数据:
CREATE TABLE TestTable (a DATE, b INT, c VARCHAR(50)); INSERT INTO TestTable VALUES ('2016-03-17', 123, 'John'), ('2018-05-21', NULL, 'Smith'), ('2023-06-05', 451, 'Park');
执行核心SQL语句(将你的表名替换为TestTable),切换到文本格式查看结果,即可得到期望的输出。
内容的提问来源于stack exchange,提问作者user12977453
相关产品推荐
相关产品推荐

