如何动态添加where子句的一部分?

时间:2020-01-24 18:13:46

标签: tsql parameters

我有一个存储过程。我需要在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

2 个答案:

答案 0 :(得分:2)

评论太久了。

像这样的变量WHERE始终会受到SQL注入的威胁,因此在执行它们时应谨慎。

Karamofrooz提出的动态SQL通常是最便捷的途径,也是最危险的途径,因此请注意Dos and Don'ts of Dynamic SQL

另一种方法是生成“厨房水槽”或“全部捕获”查询。搜索这两个词中的一个或两个都将消耗大量资源,但是这两个词是一个明智的良好开端。

Dynamic Search Conditions in T‑SQL

#BackToBasics: An Updated Kitchen Sink Example

答案 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攻击的威胁。