我有一个存储过程。我需要在WHERE子句中直接插入一些文本。我真的不想使整个SQL语句成为字符串并使用宏替换来执行它。有什么方法可以完成我想在下面完成的工作?
我要插入where子句中以&&开头的文本。 @DispositionText的值可能很多。它由我必须使用的其他人的程序提供。例如,我现在正在跟踪的代码段 将其显示为以下值:“和(Missing = 1)” ,但是它可以是任意数量的条件支票无法控制。
@AssetDesc varchar (30) = null,
@DispositionText varchar(200) = null
...
select *
from Equipment
where Equipment.Description = @AssetDesc
&&@DispositionText
order by AssetDesc
答案 0 :(得分:2)
评论太久了。
像这样的变量WHERE
始终会受到SQL注入的威胁,因此在执行它们时应谨慎。
Karamofrooz提出的动态SQL通常是最便捷的途径,也是最危险的途径,因此请注意Dos and Don'ts of Dynamic SQL。
另一种方法是生成“厨房水槽”或“全部捕获”查询。搜索这两个词中的一个或两个都将消耗大量资源,但是这两个词是一个明智的良好开端。
Dynamic Search Conditions in T‑SQL
和
答案 1 :(得分:0)
您可以执行类似以下代码的操作,最后使用EXEC()
进行发布:
Declare @AssetDesc as varchar (30);
Declare @DispositionText as varchar(200);
Declare @sqlCommand as varchar(1000);
SET @sqlCommand = 'select * from Equipment'
if(@AssetDesc <> NULL)
BEGIN
SET @sqlCommand = @sqlCommand + ' where Equipment.Description = ' + @AssetDesc;
if(@DispositionText <> NULL)
BEGIN
SET @sqlCommand = @sqlCommand + ' && ' + @DispositionText;
END
End
Else if(@DispositionText <> NULL)
BEGIN
SET @sqlCommand = @sqlCommand + @DispositionText;
END
EXEC (@sqlCommand)
此方法称为Dynamic SQL。请注意,它容易受到SQL Injection攻击的威胁。