我需要在舞台表中使用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列并存储在相应的列中。
注意:我不想使用临时表。
谢谢
答案 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