2011-05-13 41 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