次のようなクエリを実行したい:
SELECT * FROM Studio WHERE Id IN (134, 144, 132, 138, 7432, 7543, 2566)
ただし、 IN 句に渡されるIdの量は、実行時にのみ決定されます。
動的 SQL を使用する必要がありますか、それともストアド プロシージャで実行できますか?
更新: どちらかのオプションが利用可能な場合、どちらが優れていますか?
ありがとう。
次のようなクエリを実行したい:
SELECT * FROM Studio WHERE Id IN (134, 144, 132, 138, 7432, 7543, 2566)
ただし、 IN 句に渡されるIdの量は、実行時にのみ決定されます。
動的 SQL を使用する必要がありますか、それともストアド プロシージャで実行できますか?
更新: どちらかのオプションが利用可能な場合、どちらが優れていますか?
ありがとう。
Sql Server のバージョンに応じて、2 つの異なる方法のいずれかを実行できます。
Sql 2000/2005 では、ID の区切りリストを持つパラメーター (varchar 型) を使用できます。varchar を解析してアイテムを含むテーブルを返す UDF を作成します。次に、IN 句をテーブルに対して実行します (つまり、...IN (Select ID FROM @ReturnTable))。
UDF の内容の例を次に示します: http://pietschsoft.com/post/2006/02/03/T-SQL-Parse-a-delimited-string.aspx
Sql 2008 の場合、同じことができます。ただし、varchar パラメーターを渡す代わりに、追跡に切り込んで Table パラメーターを渡すことができます。IN 句にはまだサブクエリがありますが、すべて同じように機能します。または、テーブルを取得したら、そのテーブルに対して内部結合を実行し、IN 句の必要性を回避できます。
編集: 区切り文字列リンクを解析するための UDF を追加しました。
ここに記載されている解決策:
SQL Server 2005 の配列とリスト
Erland Sommarskog による SQL テキスト、SQL Server MVP
これは、ストアド プロシージャで絶対に実行できます。
ストアド プロシージャ内に一時テーブルを作成し、コンマまたは任意の区切り記号で分割された値を挿入してから、これを行います
SELECT * FROM Studio WHERE Id IN (select id from temptable)
次に、テーブルを削除します。
これは、MSSQL 2000 から使用している UDF です。これはどこかで見つけました。申し訳ありませんが、場所を思い出せません。
基本的に、最初のパラメーターが区切られた文字列で、2 番目のパラメーターが区切り文字である UDF で結合を行うことができます。
SELECT t1.somecolumn FROM sometable t1 INNER JOIN dbo.Split(@delimitedVar, ',') t2 ON t1.ID = t2.Element
CREATE FUNCTION [dbo].[Split]
(
@vcDelimitedString varchar(max),
@vcDelimiter varchar(100)
)
RETURNS @tblArray TABLE
(
ElementID smallint IDENTITY(1,1), --Array index
Element varchar(1000) --Array element contents
)
AS
BEGIN
DECLARE @siIndex smallint, @siStart smallint, @siDelSize smallint
SET @siDelSize = LEN(@vcDelimiter)
--loop through source string and add elements to destination table array
WHILE LEN(@vcDelimitedString) > 0
BEGIN
SET @siIndex = CHARINDEX(@vcDelimiter, @vcDelimitedString)
IF @siIndex = 0
BEGIN
INSERT INTO @tblArray VALUES(@vcDelimitedString)
BREAK
END
ELSE
BEGIN
INSERT INTO @tblArray VALUES(SUBSTRING(@vcDelimitedString, 1,@siIndex - 1))
SET @siStart = @siIndex + @siDelSize
SET @vcDelimitedString = SUBSTRING(@vcDelimitedString, @siStart , LEN(@vcDelimitedString) - @siStart + 1)
END
END
RETURN
END
SQL 2008 では、テーブル値パラメーターを使用できます。
SQL 2005 では、リストを XML として渡し、プロシージャで XML 処理を使用して XML をテーブル変数に細分化する場合を除き、動的 SQL を使用する必要があります。
@temp テーブルを宣言し、値をそれに分割します。その後、あなたはすることができます
select * from Studio s inner join @temptable tb on s.ID=tb.ID