如何在SQL Server语句中对同一字段内容进行换行拆分?
在SQL Server中拆分字段内容并生成多行记录
嘿,这个需求我刚好处理过,在SQL Server里可以通过字符串拆分+格式调整轻松实现,下面分不同场景给你具体方案:
1. 处理单个变量值
假设你有一个固定的输入字符串变量,我们可以先提取前面的固定前缀,再拆分服务器名称列表,最后拼接成你要的格式:
DECLARE @input NVARCHAR(MAX) = 'storage;virtual;servername1, servername2, servername3'; -- 提取前缀并调整格式(给分号后加空格,匹配期望输出的样式) DECLARE @prefix NVARCHAR(MAX) = REPLACE(LEFT(@input, CHARINDEX(';', @input, CHARINDEX(';', @input) + 1)), ';', '; '); -- 拆分服务器名称并和前缀拼接 SELECT @prefix + TRIM(value) AS result FROM STRING_SPLIT(SUBSTRING(@input, CHARINDEX(';', @input, CHARINDEX(';', @input) + 1) + 1, LEN(@input)), ',');
执行后输出就是你想要的:
storage; virtual; servername1 storage; virtual; servername2 storage; virtual; servername3
代码简单解释:
LEFT(...):定位到第二个分号的位置,提取出storage;virtual;这部分前缀;REPLACE(...):把分号替换成;,让格式和你期望的一致;SUBSTRING(...):截取第三个分号后的服务器名称列表;STRING_SPLIT(...):按逗号拆分列表,TRIM(value)去掉每个名称前后的空格;- 最后把前缀和拆分后的名称拼接,得到每行的结果。
2. 处理表中的字段
如果数据存在表中(比如表名为ServerInfo,字段名为Detail),直接把变量替换成表字段即可:
SELECT REPLACE(LEFT(Detail, CHARINDEX(';', Detail, CHARINDEX(';', Detail) + 1)), ';', '; ') + TRIM(value) AS result FROM ServerInfo CROSS APPLY STRING_SPLIT(SUBSTRING(Detail, CHARINDEX(';', Detail, CHARINDEX(';', Detail) + 1) + 1, LEN(Detail)), ',');
兼容低版本SQL Server(2016之前)
要是你的SQL Server版本低于2016(没有STRING_SPLIT函数),可以用XML方法来拆分字符串:
DECLARE @input NVARCHAR(MAX) = 'storage;virtual;servername1, servername2, servername3'; DECLARE @prefix NVARCHAR(MAX) = REPLACE(LEFT(@input, CHARINDEX(';', @input, CHARINDEX(';', @input) + 1)), ';', '; '); DECLARE @serverList NVARCHAR(MAX) = SUBSTRING(@input, CHARINDEX(';', @input, CHARINDEX(';', @input) + 1) + 1, LEN(@input)); SELECT @prefix + TRIM(Split.a.value('.', 'NVARCHAR(MAX)')) AS result FROM ( SELECT CAST('<M>' + REPLACE(@serverList, ',', '</M><M>') + '</M>' AS XML) AS Data ) AS A CROSS APPLY Data.nodes('/M') AS Split(a);
这个方法是把逗号分隔的字符串转成XML节点,再逐个提取节点值,效果和STRING_SPLIT完全一致。
内容的提问来源于stack exchange,提问作者Rindu
相关产品推荐
相关产品推荐

