如何在MS SQL Server 2012中拆分InvoiceDescription列生成多行?
解决MS SQL Server 2012中拆分InvoiceDescription字段并处理内容的需求
针对你提到的三种场景,我给你一个适配SQL Server 2012的解决方案——因为2012还没有STRING_SPLIT函数,我们用XML拆分的方法来实现,同时兼顾所有规则的处理:
解决方案代码
WITH SplitData AS ( SELECT voucher, company, -- 先统一分隔符:把', '替换成'/', 再转成XML节点格式用于拆分 CAST('<d>' + REPLACE(REPLACE(InvoiceDescription, ', ', '/'), '/', '</d><d>') + '</d>' AS XML) AS XmlData FROM YourTable -- 这里替换成你的实际表名 ) SELECT voucher, company, -- 处理末尾的'-':仅去除每个值最后一位的'-',中间的'-'保留 LTRIM(RTRIM( CASE WHEN RIGHT(Split.value('.', 'NVARCHAR(MAX)'), 1) = '-' THEN LEFT(Split.value('.', 'NVARCHAR(MAX)'), LEN(Split.value('.', 'NVARCHAR(MAX)')) - 1) ELSE Split.value('.', 'NVARCHAR(MAX)') END )) AS InvoiceDescription FROM SplitData CROSS APPLY XmlData.nodes('/d') AS SplitNode(Split) -- 过滤拆分后可能出现的空行,避免无效数据 WHERE LTRIM(RTRIM(Split.value('.', 'NVARCHAR(MAX)'))) <> ''
代码逻辑说明
我把整个处理流程拆成了几个关键步骤,确保覆盖你所有的需求:
- 统一分隔符:先用
REPLACE把,分隔的内容替换成/,这样不管原字段是用/还是,分隔的多值,都变成统一的/分隔,方便后续一次性拆分。 - XML拆分:把处理后的字符串包装成XML节点格式,再用
CROSS APPLY ... nodes('/d')来拆分出每个独立的值,这是SQL Server 2012中替代STRING_SPLIT的常用方法。 - 处理末尾'-':用
CASE判断每个拆分后的值最后一位是不是-,如果是就截取掉最后一位,否则直接保留原内容——这样不会误删值中间的-(比如如果有BOL-001-这种值,会变成BOL-001)。 - 过滤空值:用
WHERE条件过滤掉拆分后可能出现的空字符串,避免生成无效的空行。
测试验证
用你提供的示例数据运行这段代码,会得到完全符合你期望的输出结果:
voucher | company | InvoiceDescription VIV110175915 | maec | BOL013272 VIV110174380 | maec | BOL011927 VIV110174380 | maec | BOL011929 VIV110174478 | maec | BOL01256 VIV110174478 | maec | BOL012507 VIV110174478 | maec | BOL012508
内容的提问来源于stack exchange,提问作者Avi Adhikari Avi
相关产品推荐
相关产品推荐

