Sql 如何使用SELECT insert插入多行
我正在将数据从一个包含用于存储多个字符串的列的表转换为一个新表,该表中的每个字符串都有一行 其中,格式为查找表,数据为映射表 旧格式Sql 如何使用SELECT insert插入多行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在将数据从一个包含用于存储多个字符串的列的表转换为一个新表,该表中的每个字符串都有一行 其中,格式为查找表,数据为映射表 旧格式 DataId FormatId 1 1 FormatID Name 1 'A B C D' 新格式 DataId FormatId 1 1 1 2 1 3 1 4 Format
DataId FormatId
1 1
FormatID Name
1 'A B C D'
新格式
DataId FormatId
1 1
1 2
1 3
1 4
FormatID Name
1 'A'
2 'B'
3 'C'
4 'D'
我正在寻找“最好”的方法来实现这一点。使用以下
拆分函数:
分裂函数
结果集
在旧格式中,值是如何分隔的?有空格吗?@BrentD是的。我已经将查找信息作为单独的行插入,我只需要将它们映射到正确的ID并将它们插入映射表中谢谢!让我把这张照片和照片交给你,我会向你汇报的
CREATE FUNCTION Split
(
@delimited nvarchar(max),
@delimiter nvarchar(100)
) RETURNS @t TABLE
(
-- Id column can be commented out, not required for sql splitting string
id int identity(1,1), -- I use this column for numbering splitted parts
val nvarchar(max)
)
AS
BEGIN
declare @xml xml
set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'
insert into @t(val)
select
r.value('.','varchar(max)') as item
from @xml.nodes('//root/r') as records(r)
RETURN
END
DECLARE @Original_Table1 TABLE (DataID INT , FormatID INT)
INSERT INTO @Original_Table1 Values (1 ,1),(1 ,2)
DECLARE @Original_Table2 TABLE (FormatID INT , Name VARCHAR(100))
INSERT INTO @Original_Table2 Values (1 ,'A B C D')
,(2 ,'E F G H')
-- INSERT INTO NewTable bla bla.....
SELECT t1.DataID
,t2.FormatID AS FormatID_OLD
,c.id AS FormatID_new
,t2.Name AS Name_Old
,c.val AS Name
FROM @Original_Table2 t2
CROSS APPLY dbo.Split(t2.Name , ' ')c
INNER JOIN @Original_Table1 t1 ON t2.FormatID = t1.FormatID
╔════════╦══════════════╦══════════════╦══════════╦══════╗
║ DataID ║ FormatID_OLD ║ FormatID_new ║ Name_Old ║ Name ║
╠════════╬══════════════╬══════════════╬══════════╬══════╣
║ 1 ║ 1 ║ 1 ║ A B C D ║ A ║
║ 1 ║ 1 ║ 2 ║ A B C D ║ B ║
║ 1 ║ 1 ║ 3 ║ A B C D ║ C ║
║ 1 ║ 1 ║ 4 ║ A B C D ║ D ║
║ 1 ║ 2 ║ 1 ║ E F G H ║ E ║
║ 1 ║ 2 ║ 2 ║ E F G H ║ F ║
║ 1 ║ 2 ║ 3 ║ E F G H ║ G ║
║ 1 ║ 2 ║ 4 ║ E F G H ║ H ║
╚════════╩══════════════╩══════════════╩══════════╩══════╝