如何有选择地基于变量应用WHERE IN子句?

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和分页的内容是有原因的,请提供一个不会改变它的解决方案。

Lar*_*rnu 5

使用以下方法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

  • @ emzero,OPTION(RECOMPILE)可以阻止查询引擎缓存针对一组参数(或根本没有参数)优化的查询计划,当下一次执行将具有不同数量的参数(或没有参数)时根本),这将导致执行计划不理想。不要丢下它。 (3认同)
  • 是的,@emzero,这是为什么您要使用`WHILE`来进一步拆分字符串的问题?“ WHILE”是实现您所追求的目标的一种非常慢的方法。 (2认同)