2013-06-25 75 views
0

我有2個分號分隔的字符串以及其他帶有簡單值的變量傳遞給存儲過程。 這些分號分隔值實際上需要拆分並插入不同的行。 這兩個分號分開的值都不相關,因此可以按任何順序一起插入到兩個不同的字段中。拆分是通過使用 來完成的。複製代碼 從SplitString('30:40:50',':') 中選擇CAST(DATA AS INT)作爲ID,但我想將這兩個分割組合起來,這樣我就可以將它們一起傳遞到單個插入語句中。從分號分隔列表插入

例如, 我有字符串1 '30:40:50' 和字符串2 '23,58,48,60' 和一些值@ ID = 101,dateCreated會...

現在我想插入這個值到一個表是這樣的,

101      30      23      Jun 25 2013 12:22PM

101      40      58      Jun 25 2013 12:22PM

101      50      48      Jun 25 2013 12:22PM

101      null    60      Jun 25 2013 12:22PM

任何字符串可以更長或更小或相等。

我無法弄清楚這樣

任何人都可以請幫我這的正確方法。

+3

此問題已被提問數百次。搜索逗號分隔或CSV,然後執行與那些相同的操作,除了用';'替換';'... –

+0

可能的重複http://stackoverflow.com/questions/10541290/bulk-insert-from-逗號分隔字符串 –

回答

1

嘗試這一個 -

查詢與LEFT JOIN:

DECLARE 
     @s1 VARCHAR(50) 
    , @s2 VARCHAR(50) 

SELECT 
     @s1 = '30:40:50' 
    , @s2 = '23,58,48,60' 

SELECT 
     record_id = 104 
    , t2.id1 
    , t3.id2 
    , dt = CONVERT(VARCHAR(20), GETDATE(), 100) 
FROM [master].dbo.spt_values t 
LEFT JOIN (
    SELECT 
      id1 = t.c.value('@s', 'INT') 
      , rn = ROW_NUMBER() OVER (ORDER BY 1/0) 
    FROM (
     SELECT field = CAST('<t s = "' + 
       REPLACE(
         @s1 + ':' 
        , ':' 
        , '" /><t s = "') + '" />' AS XML) 
    ) d 
    CROSS APPLY field.nodes('/t') t(c) 
    WHERE t.c.value('@s', 'VARCHAR(5)') != '' 
) t2 ON t.number = t2.rn 
LEFT JOIN (
    SELECT 
      id2 = t.c.value('@s', 'INT') 
      , rn = ROW_NUMBER() OVER (ORDER BY 1/0) 
    FROM (
     SELECT field = CAST('<t s = "' + 
       REPLACE(
         @s2 + ',' 
        , ',' 
        , '" /><t s = "') + '" />' AS XML) 
    ) d 
    CROSS APPLY field.nodes('/t') t(c) 
    WHERE t.c.value('@s', 'VARCHAR(5)') != '' 
) t3 ON t.number = t3.rn 
WHERE (t2.id1 IS NOT NULL OR t3.id2 IS NOT NULL) 
    AND t.[type] = 'p' 

查詢與FULL OUTER JOIN:

SELECT 
     record_id = 104 
    , t2.id1 
    , t3.id2 
    , dt = CONVERT(VARCHAR(20), GETDATE(), 100) 
FROM (
    SELECT 
      id1 = t.c.value('@s', 'INT') 
      , rn = ROW_NUMBER() OVER (ORDER BY 1/0) 
    FROM (
     SELECT field = CAST('<t s = "' + 
       REPLACE(
         @s1 + ':' 
        , ':' 
        , '" /><t s = "') + '" />' AS XML) 
    ) d 
    CROSS APPLY field.nodes('/t') t(c) 
    WHERE t.c.value('@s', 'VARCHAR(5)') != '' 
) t2 
FULL OUTER JOIN (
    SELECT 
      id2 = t.c.value('@s', 'INT') 
      , rn = ROW_NUMBER() OVER (ORDER BY 1/0) 
    FROM (
     SELECT field = CAST('<t s = "' + 
       REPLACE(
         @s2 + ',' 
        , ',' 
        , '" /><t s = "') + '" />' AS XML) 
    ) d 
    CROSS APPLY field.nodes('/t') t(c) 
    WHERE t.c.value('@s', 'VARCHAR(5)') != '' 
) t3 ON t2.rn = t3.rn 

輸出:

record_id id1   id2   dt 
----------- ----------- ----------- -------------------- 
104   30   23   Jun 25 2013 3:50PM 
104   40   58   Jun 25 2013 3:50PM 
104   50   48   Jun 25 2013 3:50PM 
104   NULL  60   Jun 25 2013 3:50PM 
+0

張貼到不管怎樣謝謝大家的努力烏爾 http://www.codeproject.com/Questions/611559/SQLplusStatementplusforplusInserting 找到答案並回復 – shiv

+0

@shiv,如果我的解決方案也適合你請批准。 – Devart