正確的方法是使用表值參數。
但是你說你不能這樣我會用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 ║
╚════╩═══════╝
解決您的數據結構來存儲列出表格,而不是字符串。 –
我想他是從UI中獲取的字符串作爲用戶選擇列表。請檢查'CROSS APPLY'。更多可以在這裏找到http://stackoverflow.com/questions/5493510/turning-a-comma-separated-string-into-individual-rows – minatverma
我從jQuery UI中獲取數據控制,所以我不能改變它,所以我怎麼能更新每個ID與它的相應名稱從2列表。 –