ISNULL(a.ID, -1)
将使查询不可分析。你最好用
(a.ID IN (@People) OR a.ID IS NULL)
然而,一个
IN
有这么多的论据不太可能奏效。
我在这里运行内存(家里没有SSR),但如果我记得SSR在多值参数和
在
这个比例不太合适。也许你最好使用
EXISTS
和拆分器(例如
DelimitedSplit8k
)这个具体的例子依赖于
@People
少于8000个字符。
SELECT DISTINCT a.Role
FROM [Table_A] a
JOIN [Table_B] b ON a.Key = b.Key
WHERE b.Date BETWEEN @StartDate AND @EndDate
AND (EXISTS (SELECT 1
FROM dbo.DelimitedSplit8K(@People,',') DS
WHERE DS.Item = a.ID)
OR a.ID IS NULL);
然而,考虑到序数位置在这里并不重要,那么其他拆分器也可用。例如
XML Splitter
为了完整性,一个快速编写的XML拆分器函数:
CREATE FUNCTION dbo.XMLSplitter (@DelimitedString varchar(MAX))
RETURNS TABLE AS RETURN
SELECT n.d.value('.','varchar(MAX)') AS Item
FROM (VALUES(CONVERT(xml,'<d>'+ REPLACE(@DelimitedString,',','</d><d>') + '</d>'))) V(X)
CROSS APPLY V.X.nodes('d') n(d);
GO
添加了一个不带函数的完整示例:
SELECT DISTINCT a.Role
FROM [Table_A] a
JOIN [Table_B] b ON a.Key = b.Key
WHERE b.Date BETWEEN @StartDate AND @EndDate
AND (EXISTS (SELECT 1
FROM (VALUES(CONVERT(xml,'<d>'+ REPLACE(@DelimitedString,',','</d><d>') + '</d>'))) V(X)
CROSS APPLY V.X.nodes('d') n(d)
WHERE n.d.value('.','varchar(MAX)') = a.ID)
OR a.ID IS NULL);