条件 WHERE 子句

Chi*_*isu 3 sql-server-2005 sql-server condition

据我所知,我有一个独特的问题。我想知道是否有一种方法可以构造一个查询,其中实际 where 子句本身的存在是有条件的。

我正在编写一个存储过程,我想在其中传递一个过滤器(例如Col1=1 or Col2=3),并且我的查询如下所示:

set @filter = 'Col1=1 or Col2=3' --assume these variables have been declared already
select * from @tbl where @filter --I need to use a table variable
Run Code Online (Sandbox Code Playgroud)

注意:我尝试使用sp_executesqlandsp_sqlexec但都不采用表变量。我还想避免使用if-else声明。请不要建议其中任何一个作为您的答案。:)

Aar*_*and 5

动态 SQL 将无法看到您的表变量,除非您也声明它并在同一动态 SQL 范围内填充它。#temp 表可以正常工作,我不确定为什么你“需要”使用表变量,但你总是可以这样做:

SELECT * INTO #tbl FROM @tbl;
Run Code Online (Sandbox Code Playgroud)

无论如何,假设你可以改变你的流程:

CREATE TABLE #tbl(Col1 INT, Col2 INT);

INSERT #tbl SELECT 1,4
  UNION ALL SELECT 2,3
  UNION ALL SELECT 5,8;

DECLARE @sql NVARCHAR(MAX);
DECLARE @filter NVARCHAR(255);

SET @sql = N'SELECT Col1, Col2 FROM #tbl';

SET @filter = N'Col1 = 1 OR Col2 = 3';

SET @sql = @sql + COALESCE(' WHERE ' + @filter, '');

EXEC sp_executesql @sql;

DROP TABLE #tbl;
Run Code Online (Sandbox Code Playgroud)

结果:

Col1        Col2
----------- -----------
1           4
2           3
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你不能做这样的事情:

select * from @tbl where @filter
Run Code Online (Sandbox Code Playgroud)

您需要动态构建此类语句。SQL Server 不会将@tbl 或@filter 视为实体或where 子句。