emz*_*ero 0 sql sql-server where-in sql-server-2016 azure-sql-database
我有一个存储过程,需要按以逗号分隔的列表(即'1,2,3')传递的ID列表进行过滤。
我想应用WHERE IN将与这些ID匹配的子句,但仅在变量包含任何内容(IS NOT NULL AND <> '')的情况下。
这是问题的简化提琴:http : //sqlfiddle.com/#!18/5f6be/1
目前,它适用于单个和多个ID。但是,通过时'',NULL它应该返回所有内容,但不返回任何内容。
出现CTE和分页的内容是有原因的,请提供一个不会改变它的解决方案。
使用以下方法DelimitedSplit8k_lead可以达到此目的:
CREATE PROC YourProc @List varchar(8000) = NULL AS
BEGIN
SELECT {YourColumns}
FROM YourTable YT
OUTER APPLY dbo.DelimitedSplit8k_Lead(@List,',') DS
WHERE DS.item = YT.YourColumn
OR NULLIF(@List,'') IS NULL
OPTION (RECOMPILE);
END
Run Code Online (Sandbox Code Playgroud)
在OUTER APPLY使用时,仿佛NULL是传递数据集不会被淘汰。在RECOMPILE那里,因为它通过处理变成了“全部查询” NULL。