1

コード

CREATE TYPE [dbo].[IntListType] AS TABLE([Number] [int] NULL)
DECLARE @ids as IntListType;
DECLARE @TempIds as IntListType;    

状況

ストアドプロシージャでフィルタリングする必要のある製品の長いリストがあります。フィルタはユーザー定義のテーブルタイプとして指定され、各フィルタは空または満杯にすることができます。これに対して単一のクエリを作成しようとしましたが、フィルターの1つが空の場合は機能しません。

そこで、「数値」という列のみを含む別のユーザー定義テーブルタイプを作成することにしました。

次に、フィルタータイプごとに、空かどうかを確認し、空の IF (select filterName from @customtable) is not null 場合は、その名前に一致する製品IDを照会して、番号のリストに追加します。

次のフィルターが空でない場合は、IDが一時テーブルに追加され、一時テーブルが最初のテーブルと結合されます。

これまでのところ、これがフィルターがnullかどうかを処理するための最も効果的な方法であることがわかりました。とにかくそれは私が必要とするIDを取得します!

これで、すべてのフィルターが最終的に次のコードから実行されます。

IF (select count(*) from @ids) > 0
BEGIN               
    IF(select count(*) from @TempIds)
    BEGIN
    delete from @ids
        where Number not in 
            (select C.Number 
            from @ids C 
            inner join @TempIds T on C.Number = T.Number)       
    END
END
ELSE
BEGIN
    insert into @ids
    select * from @TempIds
END
delete from @TempIds

問題

最後に名前を付けたコードをストアドプロシージャに実装して、IntListTypeのリストを返す方法を探しています。ただし、@ idsのすべての実装(declare @ids as IntListType) can't be set. (asinset @ids = @TempIds'>'スカラー変数@ids'と'@TempIds'を宣言する必要があります)

どうすればこれを修正できますか?

試み

すべてのテーブルを内部結合、外部結合、およびその他の結合と組み合わせて、これをすべてスキップしようとしましたが、フィルターのいずれか(またはすべて)が空の場合、同じ結果が得られることはありません。

私が見る限り、これはすべてのフィルタータイプを効果的に進める唯一の方法であり、ヌルであるかどうかを確認します。そうでない場合はチェックします。結果などを処理します

4

1 に答える 1

0

共有したクエリの一部には、@idsまたは@TempIdsの宣言はありません。その部分を追加できますか?

それとは別に、ユーザー定義型を見るべきではないと思います。T-SQL関数はユーザー定義のテーブル型を返すことができますか?

ユーザー定義関数を見てください:

于 2013-01-18T14:51:06.887 に答える