如何使用SELECT INSERT插入多行

时间:2015-07-06 18:42:17

标签: 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

 FormatID        Name
    1            'A'
    2            'B'
    3            'C'
    4            'D'

我正在寻找“最好”的方法来做到这一点。

1 个答案:

答案 0 :(得分:2)

使用以下Split function

分割功能

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    ║
╚════════╩══════════════╩══════════════╩══════════╩══════╝
相关问题