我有一个表需要重构才能支持新功能,表格格式如下:
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。
答案 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