Tôi bị giằng xé giữa việc giới thiệu bạn với SO hoặc trả lời nó ở đây, vì đây gần như là một câu hỏi lập trình. Nhưng vì tôi đã có một giải pháp tôi sử dụng ... Tôi sẽ đăng nó;)
Cách thức hoạt động của cái này là bạn cung cấp một chuỗi được phân tách bằng dấu phẩy (tách đơn giản, không thực hiện phân tách kiểu CSV) vào quy trình được lưu trữ dưới dạng varchar (4000) và sau đó đưa danh sách đó vào hàm này và lấy ra một bảng tiện dụng, một bảng chỉ varchars.
Điều này cho phép bạn gửi các giá trị của chỉ các id mà bạn muốn xử lý và bạn có thể thực hiện một phép nối đơn giản tại thời điểm đó.
Thay phiên, bạn có thể làm điều gì đó với DataR CLR và cung cấp thông tin đó, nhưng đó là một chút chi phí để hỗ trợ và mọi người đều hiểu danh sách CSV.
USE [Database]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[splitListToTable] (@list nvarchar(MAX), @delimiter nchar(1) = N',')
RETURNS @tbl TABLE (value varchar(4000) NOT NULL) AS
/*
http://www.sommarskog.se/arrays-in-sql.html
This guy is apparently THE guy in SQL arrays and lists
Need an easy non-dynamic way to split a list of strings on input for comparisons
Usage like thus:
DECLARE @sqlParam VARCHAR(MAX)
SET @sqlParam = 'a,b,c'
SELECT * FROM (
select 'a' as col1, '1' as col2 UNION
select 'a' as col1, '2' as col2 UNION
select 'b' as col1, '3' as col2 UNION
select 'b' as col1, '4' as col2 UNION
select 'c' as col1, '5' as col2 UNION
select 'c' as col1, '6' as col2 ) x
WHERE EXISTS( SELECT value FROM splitListToTable(@sqlParam,',') WHERE x.col1 = value )
*/
BEGIN
DECLARE @endpos int,
@startpos int,
@textpos int,
@chunklen smallint,
@tmpstr nvarchar(4000),
@leftover nvarchar(4000),
@tmpval nvarchar(4000)
SET @textpos = 1
SET @leftover = ''
WHILE @textpos <= datalength(@list) / 2
BEGIN
SET @chunklen = 4000 - datalength(@leftover) / 2
SET @tmpstr = @leftover + substring(@list, @textpos, @chunklen)
SET @textpos = @textpos + @chunklen
SET @startpos = 0
SET @endpos = charindex(@delimiter, @tmpstr)
WHILE @endpos > 0
BEGIN
SET @tmpval = ltrim(rtrim(substring(@tmpstr, @startpos + 1,
@endpos - @startpos - 1)))
INSERT @tbl (value) VALUES(@tmpval)
SET @startpos = @endpos
SET @endpos = charindex(@delimiter, @tmpstr, @startpos + 1)
END
SET @leftover = right(@tmpstr, datalength(@tmpstr) / 2 - @startpos)
END
INSERT @tbl(value) VALUES (ltrim(rtrim(@leftover)))
RETURN
END