2011-05-13 40 views
6

我有一个表中的数据。我需要将它复制到另一个表格。其中一列是文本分隔的字符串。所以我想要选择所有列插入获取indentity值和子查询根据分隔符分割并插入到另一个表。我需要在select语句中拆分字符串,并插入到表

下面是数据例如

ID  Name  City  Items 
1  Michael Miami  item|item2|item3|item4|item5 
2  Jorge Hallandale item|item2|item3|item4|item5 

副本名称一个表中获取身份 和分裂和复制物品与身份列值

所以输出另一个表应该是

用户表

UserID Name  City 
1  Michael Miami 
2  Jorge Hallandale 

...

Items table 

ItemID UserID Name 
1  1  Item 
2  1  Item2 
3  1  Item3 
4  1  Item4 
5  2  Item 
6  2  Item2 
7  2  Item3 
8  2  Item4 

不能确定如何使用T-SQL做到这一点。用例子的答案将不胜感激

回答

6

你可以创建你自定义的函数来拆分T-Sql中的字符串。然后,您可以使用Split函数作为基表的JOIN的一部分,以生成INSERT语句的最终结果。看看这个post。希望这个帮助。

+0

只是为了澄清Abdul的回答(希望他可以添加此说明)......然后,您将使用Split函数作为基表的JOIN的一部分,以便为您的INSERT语句生成最终结果。 – 2011-05-13 17:41:57

1

你可以用递归来实现吗?我的T-SQL是生锈的,但是这可能会帮助您发送了正确的方向:

WITH CteList AS (
    SELECT 0 AS ItemId 
     , 0 AS DelimPos 
     , 0 AS Item_Num 
     , CAST('' AS VARCHAR(100)) AS Item 
     , Items AS Remainder 
    FROM Table1 
    UNION ALL 
    SELECT Row_Number() OVER(ORDER BY UserID) AS ItemId 
     , UserID 
     , CASE WHEN CHARINDEX('|', Remainder) > 0 
       THEN CHARINDXEX('|', Remainder) 
       ELSE LEN(Remainder) 
      END AS dpos 
     , Item_num + 1 as Item_Num 
     , REPLACE(Remainder, '|', '') AS Element 
     , right(Remainder, dpos+1) AS Remainder 
    FROM CteList 
    WHERE dpos > 0 
     AND ItemNum < 20 /* Force a MAX depth for recursion */ 
) 
SELECT ItemId 
    , Item 
FROM CteList 
WHERE item_num > 0 
ORDER BY ItemID, Item_Num 
3

为此,您可以使用XML和交叉应用。

请参阅以下内容:

DECLARE @t table (ID int, Name varchar(20), City varchar(20), Items varchar(max)); 
INSERT @t 
SELECT 1,'Michael','Miami'  ,'item|item2|item3|item4|item5' UNION 
SELECT 2,'Jorge' ,'Hallandale','item|item2|item3|item4|item5' 

DECLARE @u table (UserID int identity(1,1), Name varchar(20), City varchar(20)); 
INSERT @u (Name, City) 
SELECT DISTINCT Name, City FROM @t 

DECLARE @i table (ItemID int identity(1,1), UserID int, Name varchar(20)); 

WITH cte_Items (Name, Items) as (
    SELECT 
     Name 
     ,CAST(REPLACE('<r><i>' + Items + '</i></r>','|','</i><i>') as xml) as Items 
    FROM 
     @t 
    ) 

INSERT @i (UserID, Name) 
SELECT 
    u.UserID 
    ,s.Name as Name 
FROM 
    cte_Items t 
    CROSS APPLY (SELECT i.value('.','varchar(20)') as Name FROM t.Items.nodes('//r/i') as x(i)) s 
    INNER JOIN @u u ON t.Name = u.Name 


SELECT * FROM @i 

查看更多在这里: http://www.kodyaz.com/articles/t-sql-convert-split-delimeted-string-as-rows-using-xml.aspx