T-SQL创建动态where语句?

时间:2010-08-06 15:18:38

标签: sql sql-server tsql

我知道这是不可能的,但有什么可行吗?基本上我希望where语句是动态的,允许我传递任何字符串,它将能够搜索。

Declare @search varchar(80)
set @search = 'RegionID'

Select * from TBL_TripDetails
Where @search = '1'

感谢您的回答。在阅读了几篇文档之后,我决定使用多个select语句而不是使用动态sql。谢谢!

5 个答案:

答案 0 :(得分:5)

declare @sql nvarchar(max);
set @sql = N'select * from table where ' + quotename(@search) + N'=''1''';
exec sp_executesql @sql;

请参阅The Curse and Blessings of Dynamic SQL

答案 1 :(得分:2)

确实有可能,尽管经常不赞成。 看看sp_executesql

答案 2 :(得分:1)

Declare @search varchar(80)
set @search = 'RegionID'

declare @query varchar(max)
set @query = "Select * from TBL_TripDetails Where " + @search + " = '1'"
exec @query

答案 3 :(得分:1)

DECLARE @search VARCHAR(80)
DECLARE @SQL VARCHAR(8000)

SET @search = 'RegionID'

SET @SQL = 'SELECT * FROM TBL_TripDetails WHERE ' + @search + ' = 1'
EXEC @SQL

但要小心。连接SQL可以允许SQL注入攻击。

答案 4 :(得分:1)

我对你的问题“传递任何字符串,它将能够搜索”有点困惑。在您的示例中,您传入的字段与硬编码值1进行比较,这与您的描述不符。

如果这是您想要的,那么您将需要使用动态SQL。如果您只是希望能够支持可选搜索条件/参数(例如,如果RegionID具有值集,则应用条件,否则忽略条件),然后使用下面的示例。

DECLARE @RegionID AS VARCHAR(1);

SELECT * 
FROM TABLE
WHERE (@RegionID Is Null OR @RegionID = '' OR RegionID = @RegionID);

现在,如果@RegionID为空或NULL,则不会在条件中使用。