使用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
相关产品推荐
相关产品推荐

