如何拆分逗号分隔值并将它们存储在数据库中

时间:2013-08-09 09:38:20

标签: sql-server ssis

我有一个格式低于表格的表格

fact_id | A-B_dim_id | a_vector| b
1       | 1234       |  1.25,2.25,3.25  | 1.5

现在我想以下列格式将它们存储在另一个表中

fact_id | A-B_dim_id | a_vector_id|a_vector_value
anything| 1234       | 0          | 1.25
anything| 1234       | 1          | 2.25
anything| 1234       | 3          | 3.25

我无法控制向量中的值数,范围可以是0到365之间。

请建议我如何使用SSIS执行此操作。

提前致谢

2 个答案:

答案 0 :(得分:1)

试试这个 -

DECLARE @temp TABLE
(
      [A-B_dim_id] INT
    , a_vector NVARCHAR(50)
)

INSERT INTO @temp ([A-B_dim_id], a_vector)
VALUES (1234, '1.25,2.25,3.25')

DECLARE @temp2 TABLE
(
      fact_id INT IDENTITY(1,1) PRIMARY KEY
    , [A-B_dim_id] INT
    , a_vector_id SMALLINT
    , a_vector_value DECIMAL(10,2)
)

INSERT INTO @temp2 ([A-B_dim_id], a_vector_id, a_vector_value)
SELECT 
      [A-B_dim_id]
    , ROW_NUMBER() OVER (PARTITION BY [A-B_dim_id] ORDER BY 1/0)
    , t.c.value('.', 'DECIMAL(10,2)')
FROM (
     SELECT 
          [A-B_dim_id]
        , ID = CAST ('<t>' + REPLACE(a_vector, ',', '</t><t>') + '</t>' AS XML)
     FROM @temp
) r 
CROSS APPLY ID.nodes ('/t') t(c) 

SELECT * FROM @temp2

输出 -

fact_id     A-B_dim_id  a_vector_id a_vector_value
----------- ----------- ----------- ---------------------------------------
1           1234        1           1.25
2           1234        2           2.25
3           1234        3           3.25

答案 1 :(得分:1)

查看CodePlex上提供的UnPivotDelimitedString自定义转换(链接如下)。

UnPivotDelimitedString

我不能保证它没有任何好处,但它似乎有助于完成你在SSIS中的任务。