将分号分隔列表导入新表

时间:2013-12-04 14:55:24

标签: sql sql-server

我有一个表需要重构才能支持新功能,表格格式如下:

RefID (int), Data (nvarchar(255))
--------------
1, 161;162;163;164
2, 131;132;133;144

我需要转换这些数据并将其导入新表中,如下所示:

ID (PK), RefID (int), Data (int))
-------------------------------------------
1,1,161
2,1,162
3,1,163
4,1,164
5,2,131
6,2,132
:   :

基本上,拆分分号分隔列表(数据)并为每个列表创建一个新记录,并在此过程中转换为INT。

3 个答案:

答案 0 :(得分:3)

您可以使用表值函数来拆分字符串并使用它来填充表格。这是一个Split函数(代码为@AaronBertrand):

CREATE FUNCTION [dbo].[SplitString]
    (
        @List NVARCHAR(MAX),
        @Delim VARCHAR(255)
    )
    RETURNS TABLE
    AS
        RETURN ( SELECT [Value] FROM 
          ( 
            SELECT 
              [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
              CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
            FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
              FROM sys.all_objects) AS x
              WHERE Number <= LEN(@List)
              AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim
          ) AS y
        );

然后你只需要做以下事情:

INSERT INTO dbo.ResultTable(RefID, Data)
SELECT  A.RefID,
        B.[Value]
FROM dbo.YourTable A
CROSS APPLY [dbo].[SplitString](A.Data,';') B

Here is an sqlfiddle及其演示。

答案 1 :(得分:0)

你可以编写sql脚本来处理这个...但如果这是一次性交易并且不介意使用其他方法......

select replace(convert(varchar(100),RefID) + ';' + Data,';',',') Data
from table

然后将结果保存到csv并导入。很快的解决方案。或者你可以写一个脚本。 ;)

答案 2 :(得分:0)

要添加到@ Lamak的答案......这里是枢轴部分

SELECT Id, [1],[2],[3],[4]
FROM (
    SELECT a.Id, b.value, ROW_NUMBER() OVER (PARTITION BY a.Id ORDER BY a.Id) ColNumber
    FROM dbo.YourTable a
    CROSS APPLY dbo.SplitString(DATA,',') b) pvt
PIVOT (MIN(value) FOR ColNumber IN ([1],[2],[3],[4])) p