2016-01-01 64 views
2

我想在存儲過程中更新以字符串逗號分隔的值列表的字符串逗號分隔列表中傳遞的ID列表。SQL更新帶有字符串值列表的ID的字符串列表

那麼我怎樣才能更新每個ID與它的相應名稱從2列表。 例如:

ids = "1, 2, 4 ,8"; 
names = "sam, john, sarah ,barry"; 

ALTER PROCEDURE [dbo].[update_work] 
    @ids nvarchar(MAX), 
    @names nvarchar(MAX) 
AS 
BEGIN 
    ??? 
END 
+1

解決您的數據結構來存儲列出表格,而不是字符串。 –

+1

我想他是從UI中獲取的字符串作爲用戶選擇列表。請檢查'CROSS APPLY'。更多可以在這裏找到http://stackoverflow.com/questions/5493510/turning-a-comma-separated-string-into-individual-rows – minatverma

+0

我從jQuery UI中獲取數據控制,所以我不能改變它,所以我怎麼能更新每個ID與它的相應名稱從2列表。 –

回答

1

正確的方法是使用表值參數。

但是你說你不能這樣我會用SUBSTRING和tally表來拆分逗號分隔的字符串。

結構:

CREATE TABLE #tab(id INT, name VARCHAR(100)); 

INSERT INTO #tab(id, name) 
VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), 
     (5, 'e'), (6, 'f'), (7, 'g'), (8, 'h'), (9, 'i'); 

程序(臨時過程,因爲SEDE不允許創建正常數據庫對象):

CREATE PROCEDURE #update_work @ids nvarchar(MAX), @names nvarchar(MAX) 
AS 
BEGIN 
;WITH cte AS 
(SELECT TOP 1000 rn = ROW_NUMBER() OVER(ORDER BY 1/0) 
    FROM master..spt_values 
), cte2 AS 
(SELECT [val] = SUBSTRING(',' + @ids + ',', rn + 1, 
        CHARINDEX(',', ',' + @ids + ',', rn + 1) - rn -1) 
     ,[r] = ROW_NUMBER() OVER(ORDER BY rn) 
     ,[type] = 'id' 
    FROM cte 
    WHERE rn <= LEN(',' + @ids + ',') - 1 
    AND SUBSTRING(',' + @ids + ',', rn, 1) = ',' 
    UNION ALL 
    SELECT [val] = SUBSTRING(',' + @names + ',', rn + 1, 
        CHARINDEX(',', ',' + @names + ',', rn + 1) - rn -1) 
     ,[r] = ROW_NUMBER() OVER(ORDER BY rn) 
     ,[type] = 'name' 
    FROM cte 
    WHERE rn <= LEN(',' + @names + ',') - 1 
    AND SUBSTRING(',' + @names + ',', rn, 1) = ',' 
), cte3 AS 
(SELECT [id] = cte2.val, [name] = cte2a.val 
    FROM cte2 
    JOIN cte2 AS cte2a 
    ON cte2.[r] = cte2a.[r] 
    AND cte2.[type] = 'id' 
    AND cte2a.[type] = 'name' 
) 
UPDATE t 
SET name = c3.name 
FROM #tab AS t 
JOIN cte3 c3 ON t.id = c3.id; 
END; 

測試:

EXEC#update_work 
    @ids = '1, 2, 4 ,8', 
    @names = 'sam, john, sarah ,barry'; 

SELECT * 
FROM #tab; 

LiveDemo

輸出:

╔════╦═══════╗ 
║ id ║ name ║ 
╠════╬═══════╣ 
║ 1 ║ sam ║ 
║ 2 ║ john ║ 
║ 3 ║ c  ║ 
║ 4 ║ sarah ║ 
║ 5 ║ e  ║ 
║ 6 ║ f  ║ 
║ 7 ║ g  ║ 
║ 8 ║ barry ║ 
║ 9 ║ i  ║ 
╚════╩═══════╝ 
相關問題