You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)'))) <> ''

代码逻辑说明

我把整个处理流程拆成了几个关键步骤,确保覆盖你所有的需求:

  1. 统一分隔符:先用REPLACE把, 分隔的内容替换成/,这样不管原字段是用/还是, 分隔的多值,都变成统一的/分隔,方便后续一次性拆分。
  2. XML拆分:把处理后的字符串包装成XML节点格式,再用CROSS APPLY ... nodes('/d')来拆分出每个独立的值,这是SQL Server 2012中替代STRING_SPLIT的常用方法。
  3. 处理末尾'-':用CASE判断每个拆分后的值最后一位是不是-,如果是就截取掉最后一位,否则直接保留原内容——这样不会误删值中间的-(比如如果有BOL-001-这种值,会变成BOL-001)。
  4. 过滤空值:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:56:37