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

如何在SQL Server中将单列分号分隔字符串拆分至多列并创建视图

问题排查
  • 首先确认你的SQL Server版本和数据库兼容级别:string_split 函数仅支持SQL Server 2016及以上版本,且需要将数据库兼容级别调整为130及以上,可执行以下语句查看当前兼容级别:
SELECT name, compatibility_level FROM sys.databases WHERE name = '你的数据库名';

如果兼容级别低于130,执行以下语句调整(需管理员权限):

ALTER DATABASE 你的数据库名 SET COMPATIBILITY_LEVEL = 130;
  • 原代码的标签顺序问题:string_split 官方未承诺返回值的顺序和原字符串中的存储顺序一致,你当前的排序逻辑不会按原标签顺序生成行号,可能导致Tag1/Tag2/Tag3的顺序不符合预期。
  • 边界情况遗漏:原Tags字段如果存在首尾分号、连续分号的情况,会拆分出空值标签,建议提前过滤。
可行实现方案

方案1:SQL Server 2016及以上版本(适配string_split)

以下代码可直接用于创建视图,添加了空标签过滤逻辑:

CREATE VIEW vw_CompanyTags AS
WITH TagsDelimited_CTE AS
(
    SELECT 
        CompanyName, 
        CompanyNumber, 
        Value,
        -- SQL Server 2022+ 可替换为 string_split(Tags,';', 1) 后 ORDER BY ordinal 保证标签顺序
        ROW_NUMBER() OVER(PARTITION BY CompanyName, CompanyNumber ORDER BY (SELECT NULL)) AS RowNum
    FROM Source
    CROSS APPLY string_split(Tags,';') 
    WHERE LTRIM(RTRIM(Value)) <> '' -- 过滤空标签
)
SELECT 
    CompanyName, 
    CompanyNumber,
    [1] AS Tag1,
    [2] AS Tag2,
    [3] AS Tag3
FROM TagsDelimited_CTE
PIVOT
(
    MAX(Value)
    FOR RowNum IN ([1],[2],[3])
) AS PVT;

方案2:兼容SQL Server 2008及以上旧版本

如果你的SQL Server版本过低不支持string_split,可以用XML拆分方式实现,兼容性更好:

CREATE VIEW vw_CompanyTags AS
WITH TagsDelimited_CTE AS
(
    SELECT 
        CompanyName,
        CompanyNumber,
        LTRIM(RTRIM(x.n.value('.', 'NVARCHAR(MAX)'))) AS Value,
        ROW_NUMBER() OVER(PARTITION BY CompanyName, CompanyNumber ORDER BY (SELECT NULL)) AS RowNum
    FROM (
        SELECT 
            CompanyName,
            CompanyNumber,
            CAST('<x>' + REPLACE(Tags, ';', '</x><x>') + '</x>' AS XML) AS TagsXml
        FROM Source
        WHERE Tags IS NOT NULL AND Tags <> ''
    ) t
    CROSS APPLY TagsXml.nodes('/x') x(n)
    WHERE LTRIM(RTRIM(x.n.value('.', 'NVARCHAR(MAX)'))) <> ''
)
SELECT 
    CompanyName, 
    CompanyNumber,
    [1] AS Tag1,
    [2] AS Tag2,
    [3] AS Tag3
FROM TagsDelimited_CTE
PIVOT
(
    MAX(Value)
    FOR RowNum IN ([1],[2],[3])
) AS PVT;

内容的提问来源于stack exchange,提问作者Stuart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:21:02