10

我想根据存储过程输入构建自定义 Where 条件,如果不为空,那么我将在语句中使用它们,否则我不会使用它们。

if @Vendor_Name is not null
    begin 

    set @where += 'Upper(vendors.VENDOR_NAME) LIKE "%"+ UPPER(@Vendor_Name) +"%"'

    end
    else if @Entity is not null
    begin
    set @where += 'AND headers.ORG_ID = @Entity'
    end
select * from table_name where @where

但我得到这个错误

An expression of non-boolean type specified in a context where a condition is expected, near 'set'.
4

3 回答 3

10

用这个 :

Declare @Where NVARCHAR(MAX) 

...... Create your Where

DECLARE @Command NVARCHAR(MAX) 
Set @Command = 'Select * From SEM.tblMeasureCatalog AS MC ' ;

If( @Where <> '' )
   Set @Comand = @Command + ' Where ' + @Where

Execute SP_ExecuteSQL  @Command

我测试了这个并且它有效

于 2013-09-30T09:38:02.330 回答
8

您不能像在这一行中那样简单地将变量放入普通 SQL 中:

select * from table_name where @where;

您需要使用动态 SQL。所以你可能有类似的东西:

DECLARE @SQL NVARCHAR(MAX) = 'SELECT * FROM Table_Name WHERE 1 = 1 ';
DECLARE @Params NVARCHAR(MAX) = '';

IF @Vendor_Name IS NOT NULL
    BEGIN
        SET @SQL += ' AND UPPER(vendors.VENDOR_NAME) LIKE ''%'' + UPPER(@VendorNameParam) + ''%''';
    END
ELSE IF @Entity IS NOT NULL
    BEGIN
        SET @SQL += ' AND headers.ORG_ID = @EntityParam';
    END;

EXECUTE SP_EXECUTESQL @SQL, N'@VendorNameParam VARCHAR(50), @EntityParam INT', 
                    @VendorNameParam = @Vendor_Name, @EntityParam = @Entity;

我假设您的实际问题更复杂,并且您为此简化了它,但是如果您的所有谓词都使用 添加IF .. ELSE IF.. ELSE IF,那么您根本不需要动态 SQL,您可以使用:

IF @Vendor_Name IS NOT NULL
    BEGIN
        SELECT  * 
        FROM    Table_Name
        WHERE   UPPER(vendors.VENDOR_NAME) LIKE '%' + UPPER(@Vendor_Name) + '%';
    END
ELSE IF @Entity IS NOT NULL
    BEGIN
        SELECT  * 
        FROM    Table_Name
        WHERE   headers.ORG_ID = @Entity;
    END
于 2013-09-30T09:46:40.463 回答
2

老问题,但想补充一下我刚刚发现使用

where CASE WHEN @id = 0 THEN 1 ELSE id END = CASE WHEN @id = 0 THEN 1 ELSE @id END

这是来自以下步骤:

where id = @id

检查@id 是否为空(或无效)或具有有效值,因此使用大小写替换@id:

where id = 
CASE WHEN @id is null
    THEN 0
    ELSE @id
END

这将最终成为

where id = 0 -- if @id is null, still affected your query
where id = @id -- if @id have valid value

因为我们只想在有有效数据的情况下使用这个“where”子句,然后我们也改变 id

where 
CASE WHEN @id is null
    THEN 0
    ELSE id
END 
= 
CASE WHEN @id is null
    THEN 0
    ELSE @id
END

然后将最终成为

where 0 = 0 -- if @id is null and it doesn't affect your query
where id = @id -- if @id have valid value

不要忘记如果 id 是 varchar,使用 0 作为 '0'

CASE WHEN @id is null
    THEN '0'
    ELSE id
END 

我在我的项目中使用它并且运行良好,即使我在一个查询中使用超过 1 个。请让我知道这个查询是否在更大的数据上花费时间

于 2019-12-19T04:28:25.720 回答