2014-05-20 20 views
0

我們有一個帶有varchar列的用戶ID表,其結果是一列外鍵。爲什麼它是一個列表,而不是一個參考,因爲它必須是:/對一個Varchar進行反序列化(列表)然後對每個項目執行INSERT作爲一個TRIGGER

USERID CLASSES_ATTENDED 
100099 01052013,02042013,04302013,06042013 

的表確實存在這些類符合他們的名字,但我們沒有列表的方式類名的用戶ID 。

CLASS  NAME 
01052013 MATH 
02042013 SCIENCE 
04302013 COMPUTERS 
06042013 COOKING 

提供給我的唯一的解決辦法是將varchar CLASSES_ATTENDED列將讀取每一個「關鍵」一個接一個,然後在另一個插入用戶ID/CLASS記錄(S)INSERT觸發器後使用表。

如何對列表進行反序列化,然後爲觸發器聲明中的每個項目執行一個INSERT語句?

我有SQLServer 2005,使用Management Studio非SSIS安裝。

在此先感謝!

+0

我想你想分裂功能。這裏有一個參考。 。 。 http://stackoverflow.com/questions/2507330/sql-server-split-operation。但是,您的問題實際上並不能解釋您想要做什麼。什麼是問題? –

+0

感謝您的鏈接!我的問題接近底部:如何對列表進行反序列化,然後在觸發器聲明中爲每個項目執行一條INSERT語句? – user2888449

回答

0

CROSS APPLY子句訣竅!

SELECT U.USERID, T.item AS CLASS 
FROM bad_table U 
CROSS APPLY split(M.CLASSES, ',') AS T 
0

另一種「反序列化」數據的方法是使用連接。

insert into ProperJunctionTable(userid, class) 
    select t.userid, c.class 
    from table t join 
     classes c 
     on ',' + t.classes_attended + ',' like '%,' + c.class + ',%'; 

但是,很可能split()會表現更好。順便說一句,如果您因某種原因不喜歡用戶定義的函數,則可以使用遞歸CTE實現split()

+0

我不是在追問爲什麼要添加逗號?我的系統似乎不喜歡第二套,圍繞c.class的。 – user2888449

+0

@ user2888449。 。 。逗號分隔這些值,所以「10」將不匹配「100」。在這種情況下它們可能不是必需的。 –

相關問題