在SQL Server 2016中使用String_Split()拆分字符串

时间:2018-10-23 14:25:12

标签: tsql ssis split delimiter sql-server-2016

我需要在舞台表中使用STRING_SPLIT并将结果导入到另一个表中。

阶段表:

DECLARE @stage TABLE(ID INT, Code VARCHAR(500))

INSERT INTO @stage
    SELECT 1, '123_Potato_Orange_Fish' 
    UNION ALL
    SELECT 2, '456_Tomato_Banana_Chicken' 
    UNION ALL
    SELECT 3, '789_Onion_Mango_Lamb' 

最终表:

DECLARE @Final TABLE
               (
                    ID INT, 
                    code VARCHAR(500),
                    Unit VARCHAR(100),
                    Vegetable VARCHAR(100),
                    Fruit VARCHAR(100),
                    Meat VARCHAR(100)
               )

我正在使用SSIS执行任务来转换阶段表数据并将其插入到最终表中。阶段表中的“代码”列为字符串,“ _”用作定界符。我需要分离字符串并显示最终表,如下所示

ID        code                  Unit    Vegetable   Fruit   Meat
------------------------------------------------------------------
1   123_Potato_Orange_Fish      123      Potato    Orange   Fish
2   456_Tomato_Banana_Chicken   456      Tomato    Banana   Chicken
3   789_Onion_Mango_Lamb        789      Onion     Mango    Lamb

我正在尝试使用SQL Server 2016内置的String_Split()函数,如下所示:

SELECT 
    ID,
    Code, f.value AS Vegetable 
FROM 
    @stage AS s
CROSS APPLY
    (SELECT 
         value,
         ROW_NUMBER() OVER(PARTITION BY s.ID ORDER BY s.ID) AS rn 
     FROM
         String_Split(s.Code, '_')) AS f
WHERE 
    s.ID = 1 AND f.rn = 2

但是它一次只能拆分一个字符串,因为我的舞台数据包含数百万条记录,所以我需要将所有字符串拆分为code列并存储在相应的列中。

注意:我不想使用临时表。

谢谢

3 个答案:

答案 0 :(得分:2)

您可以添加派生列,并假定格式与您列出的内容一致,请使用TOKEN函数根据"_"分隔符和每个字符串的位置来拆分输入。从这里,您可以将每个输出映射到适当的目标列。下面的三个语句根据问题中的示例数据拆分您的代码列。请注意,令牌的输出数据类型为DT_WSTR(Unicode)。如果您需要非Unicode数据,则必须将其强制转换回DT_STR,也可以通过在每个语句之前添加(DT_STR,50,1252)(根据需要调整长度)在同一“派生列”中完成

  • TOKEN(Code,"_",1)
  • TOKEN(Code,"_",2)
  • TOKEN(Code,"_",3)

答案 1 :(得分:1)

就像@ userfl89一样,这是另一个使用脚本组件的SSIS解决方案: 将4个输出列添加到output0。确保在输入栏中选择“代码为”。

string[] col = Row.Code.ToString().Split('_');

Row.Unit = Int.Parse(col[0]);
Row.Vegetable = col[1];
Row.Fruit = col[2];
Row.Meat = col[3];

答案 2 :(得分:0)

由于接受的答案使用了绑定到SSIS的TOKEN(),因此我也想提供一个SQL Server解决方案。

您正在使用v2016,该版本允许OPENJSON。当您在JSON数组上使用此控件时,您将获得一列[key]来指示数组中的位置,以及一列[value]来提供实际内容。

将CSV字符串转换为JSON数组非常容易。其余者通过条件聚集进行枢纽。试试看:

DECLARE @stage TABLE(ID INT, Code VARCHAR(500))

INSERT INTO @stage
    SELECT 1, '123_Potato_Orange_Fish' 
    UNION ALL
    SELECT 2, '456_Tomato_Banana_Chicken' 
    UNION ALL
    SELECT 3, '789_Onion_Mango_Lamb' 

SELECT ID 
      ,Code
      ,MAX(CASE WHEN [key]=0 THEN CAST([value] AS INT) END) AS Unit
      ,MAX(CASE WHEN [key]=1 THEN [value] END) AS Vegetable
      ,MAX(CASE WHEN [key]=2 THEN [value] END) AS Fruit
      ,MAX(CASE WHEN [key]=3 THEN [value] END) AS Meat
FROM @stage
CROSS APPLY OPENJSON('["' + REPLACE(Code,'_','","') + '"]') A
GROUP BY ID,Code