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

使用SSIS或T-SQL将混合引号的逗号分隔值列拆分为多列

混合格式逗号分隔字段(带引号内逗号)T-SQL拆分方案

方案1:SQL Server 2017+ 原生JSON实现(最稳定,无第三方依赖)

该方案利用JSON解析规则自动识别引号边界,完全规避引号内逗号被误判为分隔符的问题,性能优于自定义函数。
操作逻辑:

  • 把原字符串中的双引号替换为JSON转义格式\"
  • 把所有逗号替换为",",为每个字段包裹JSON字符串边界
  • 首尾补["和"]转成标准JSON数组
  • 用JSON_VALUE按索引取对应F1~F11字段
    示例代码:
SELECT
    JSON_VALUE(JsonArray, '$[0]') AS F1,
    JSON_VALUE(JsonArray, '$[1]') AS F2,
    JSON_VALUE(JsonArray, '$[2]') AS F3,
    JSON_VALUE(JsonArray, '$[3]') AS F4,
    JSON_VALUE(JsonArray, '$[4]') AS F5,
    JSON_VALUE(JsonArray, '$[5]') AS F6,
    JSON_VALUE(JsonArray, '$[6]') AS F7,
    JSON_VALUE(JsonArray, '$[7]') AS F8,
    JSON_VALUE(JsonArray, '$[8]') AS F9,
    JSON_VALUE(JsonArray, '$[9]') AS F10,
    JSON_VALUE(JsonArray, '$[10]') AS F11
FROM (
    SELECT 
        '["' + REPLACE(REPLACE(C0, '"', '\"'), ',', '","') + '"]' AS JsonArray
    FROM 你的表名
) AS T

方案2:SQL Server 2016及以下版本兼容方案

通过自定义标量函数遍历字符串识别引号边界,遇到逗号且不在引号范围内时才执行拆分。
自定义函数代码:

CREATE FUNCTION dbo.SplitCsvField (@CsvString NVARCHAR(MAX), @FieldIndex INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @InQuote BIT = 0, @CurrentPos INT = 1, @FieldStart INT = 1, @FieldCount INT = 0
    WHILE @CurrentPos <= LEN(@CsvString)
    BEGIN
        IF SUBSTRING(@CsvString, @CurrentPos, 1) = '"' SET @InQuote = 1 - @InQuote
        IF SUBSTRING(@CsvString, @CurrentPos, 1) = ',' AND @InQuote = 0
        BEGIN
            SET @FieldCount = @FieldCount + 1
            IF @FieldCount = @FieldIndex RETURN REPLACE(SUBSTRING(@CsvString, @FieldStart, @CurrentPos - @FieldStart), '"', '')
            SET @FieldStart = @CurrentPos + 1
        END
        SET @CurrentPos = @CurrentPos + 1
    END
    -- 处理最后一个字段
    SET @FieldCount = @FieldCount + 1
    IF @FieldCount = @FieldIndex RETURN REPLACE(SUBSTRING(@CsvString, @FieldStart, @CurrentPos - @FieldStart), '"', '')
    RETURN NULL
END

调用示例:

SELECT
    dbo.SplitCsvField(C0,1) AS F1,
    dbo.SplitCsvField(C0,2) AS F2,
    dbo.SplitCsvField(C0,3) AS F3,
    dbo.SplitCsvField(C0,4) AS F4,
    dbo.SplitCsvField(C0,5) AS F5,
    dbo.SplitCsvField(C0,6) AS F6,
    dbo.SplitCsvField(C0,7) AS F7,
    dbo.SplitCsvField(C0,8) AS F8,
    dbo.SplitCsvField(C0,9) AS F9,
    dbo.SplitCsvField(C0,10) AS F10,
    dbo.SplitCsvField(C0,11) AS F11
FROM 你的表名

方案3:SSIS适配方案

放弃TOKEN拆分逻辑,改用脚本组件处理:

  • 在数据流中添加脚本组件,设置为转换类型
  • 输入列选择C0,输出添加F1~F11共11个字符串类型字段
  • 在脚本中调用.NET自带的Microsoft.VisualBasic.FileIO.TextFieldParser类,直接按CSV规则拆分,自动忽略引号内逗号,无需自定义拆分逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:36:03