10

ストアド プロシージャの入力に基づいてカスタムの Where 条件を作成したいのですが、null でない場合はステートメントで使用し、それ以外の場合は使用しません。

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 が null (または無効) であるか、有効な値を持っているかを確認して、大文字と小文字を使用して @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 に答える