T-SQL创建动态where语句?

3

我知道这是不可能的,但有没有什么方法可以实现?基本上,我想让where语句是动态的,允许我传递任何字符串,它将能够搜索。

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

Select * from TBL_TripDetails
Where @search = '1'

感谢您的回答。在阅读了一些文档后,我决定使用多个选择语句而不是动态SQL。谢谢!

5个回答

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

请参阅动态SQL的诅咒和祝福


4
仔细想了想,我可能会使用多个选择语句,风险不值得回报。 - Spooks

2

虽然这样做经常会受到指责,但确实是可能的。 可以看看 sp_executesql


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 注入攻击。


1

我对你的问题“传递任何字符串,它将能够搜索”有点困惑。在你的例子中,你传递了一个字段,该字段正在与硬编码值1进行比较,这实际上并不符合你的描述。

如果这确实是你想要的,那么你需要使用动态SQL。如果你只想支持可选的搜索条件/参数(例如,如果RegionID有一个设置值,则应用条件,否则忽略条件),那么请使用下面的示例。

DECLARE @RegionID AS VARCHAR(1);

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

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接