221

他の誰かの SQL レポートをデバッグしようとしていて、基になるレポート クエリを SQL 2012 のクエリ ウィンドウに配置しました。

レポートが要求するパラメーターの 1 つは、整数のリストです。これは、複数選択ドロップダウン ボックスを使用してレポートで実現されます。whereレポートの基礎となるクエリは、句でこの整数リストを使用します。

select *
from TabA
where TabA.ID in (@listOfIDs)

デバッグ中のクエリを変更したくありませんが、このタイプのデータを保持してテストできる変数を SQL Server で作成する方法がわかりません。

例えば

declare @listOfIDs int
set listOfIDs  = 1,2,3,4

整数のリストを保持できるデータ型はありません。レポートと同じ値を使用して SQL Server でレポート クエリを実行するにはどうすればよいですか?

4

8 に答える 8

287

テーブル変数

declare @listOfIDs table (id int);
insert @listOfIDs(id) values(1),(2),(3);    

select *
from TabA
where TabA.ID in (select id from @listOfIDs)

また

declare @listOfIDs varchar(1000);
SET @listOfIDs = ',1,2,3,'; --in this solution need put coma on begin and end

select *
from TabA
where charindex(',' + CAST(TabA.ID as nvarchar(20)) + ',', @listOfIDs) > 0
于 2013-08-22T06:01:07.207 に答える
42

変数が次のようなものであると仮定します。

CREATE TYPE [dbo].[IntList] AS TABLE(
[Value] [int] NOT NULL
)

ストアド プロシージャはそれを次の形式で使用しています。

ALTER Procedure [dbo].[GetFooByIds]
    @Ids [IntList] ReadOnly
As 

IntList を作成し、次のようにプロシージャを呼び出すことができます。

Declare @IDs IntList;
Insert Into @IDs Select Id From dbo.{TableThatHasIds}
Where Id In (111, 222, 333, 444)
Exec [dbo].[GetFooByIds] @IDs

または、IntList を自分で提供している場合

DECLARE @listOfIDs dbo.IntList
INSERT INTO @listofIDs VALUES (1),(35),(118);
于 2015-10-16T13:11:39.973 に答える
24

そうです、SQL-Serverには整数のリストを保持できるデータ型はありません。しかし、できることは、整数のリストを文字列として保存することです。

DECLARE @listOfIDs varchar(8000);
SET @listOfIDs = '1,2,3,4';

次に、文字列を個別の整数値に分割し、それらをテーブルに入れることができます。あなたの手順はすでにこれを行っているかもしれません。

動的クエリを使用して同じ結果を達成することもできます。

DECLARE @SQL nvarchar(8000);

SET @SQL = 'SELECT * FROM TabA WHERE TabA.ID IN (' + @listOfIDs + ')';
EXECUTE (@SQL);
于 2013-08-22T05:35:17.283 に答える
6

最終的に、クエリの動作を変更しないと変数に値を格納できないという結論に達しました。SQL プロファイラーを使用して値を取得し、それをクエリにハードコーディングして、それがどのように機能するかを確認しました。これらの整数配列は 18 個あり、中には 30 を超える要素を含むものもありました。

MS/SQL には、追加のデータ型を言語に導入する必要があると思います。配列は非常に一般的であり、ストアド プロシージャで使用できない理由がわかりません。

于 2013-08-27T01:25:17.067 に答える