コード
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. (asin
set @ids = @TempIds'>'スカラー変数@ids'と'@TempIds'を宣言する必要があります)
どうすればこれを修正できますか?
試み
すべてのテーブルを内部結合、外部結合、およびその他の結合と組み合わせて、これをすべてスキップしようとしましたが、フィルターのいずれか(またはすべて)が空の場合、同じ結果が得られることはありません。
私が見る限り、これはすべてのフィルタータイプを効果的に進める唯一の方法であり、ヌルであるかどうかを確認します。そうでない場合はチェックします。結果などを処理します