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_executesql
andsp_sqlexec
但都不采用表变量。我还想避免使用if-else
声明。请不要建议其中任何一个作为您的答案。:)
动态 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 子句。
归档时间: |
|
查看次数: |
2930 次 |
最近记录: |