Bạn có thể chuyển nó vào dưới dạng danh sách được phân tách bằng dấu phẩy, sau đó sử dụng hàm tách và kết hợp với kết quả.
CREATE FUNCTION dbo.SplitInts
(
@List VARCHAR(MAX),
@Delimiter CHAR(1)
)
RETURNS TABLE
AS
RETURN
(
SELECT Item = CONVERT(INT, Item)
FROM
(
SELECT Item = x.i.value('(./text())[1]', 'INT')
FROM
(
SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a
CROSS APPLY
[XML].nodes('i') AS x(i)
) AS y
WHERE Item IS NOT NULL
);
Bây giờ thủ tục được lưu trữ của bạn:
CREATE PROCEDURE dbo.doStuff
@List VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
SELECT cols FROM dbo.table AS t
INNER JOIN dbo.SplitInts(@List, ',') AS list
ON t.ID = list.Item;
END
GO
Sau đó, gọi nó là:
EXEC dbo.doStuff @List = '1, 2, 3, ...';
Bạn có thể xem một số so sánh nền, các tùy chọn khác và hiệu suất tại đây:
- Tách chuỗi đúng cách - hoặc cách tốt nhất tiếp theo cách
- Chuỗi phân tách:Theo dõi
- Tách chuỗi:Giờ đây với ít T-SQL hơn
- So sánh các phương pháp tách / nối chuỗi
- Xử lý danh sách các số nguyên:cách tiếp cận của tôi
- Tách danh sách các số nguyên:một đợt khác
- Thông tin thêm về phân tách danh sách:dấu phân cách tùy chỉnh, ngăn trùng lặp và duy trì trật tự
- Đang xóa Bản sao từ các chuỗi trong SQL Server
Tuy nhiên, trên SQL Server 2016 trở lên, bạn nên xem STRING_SPLIT()
và STRING_AGG()
:
- Sự ngạc nhiên và giả định về hiệu suất:STRING_SPLIT ()
- STRING_SPLIT () trong SQL Server 2016:Tiếp theo # 1
- STRING_SPLIT () trong SQL Server 2016:Tiếp theo # 2
- SQL Server v.Next:Hiệu suất STRING_AGG ()
- Giải quyết các sự cố cũ với các hàm STRING_AGG và STRING_SPLIT mới của SQL Server