6

次のようなクエリを実行したい:

 SELECT * FROM Studio WHERE Id IN (134, 144, 132, 138, 7432, 7543, 2566)

ただし、 IN 句に渡されるIdの量は、実行時にのみ決定されます。

動的 SQL を使用する必要がありますか、それともストアド プロシージャで実行できますか?

更新: どちらかのオプションが利用可能な場合、どちらが優れていますか?

ありがとう。

4

6 に答える 6

8

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 を追加しました。

于 2009-06-10T17:29:28.627 に答える
5

ここに記載されている解決策:

SQL Server 2005 の配列とリスト

Erland Sommarskog による SQL テキスト、SQL Server MVP

http://www.sommarskog.se/arrays-in-sql-2005.html

于 2009-06-10T17:28:19.533 に答える
3

これは、ストアド プロシージャで絶対に実行できます。

ストアド プロシージャ内に一時テーブルを作成し、コンマまたは任意の区切り記号で分割された値を挿入してから、これを行います

SELECT * FROM Studio WHERE Id IN (select id from temptable)

次に、テーブルを削除します。

于 2009-06-10T17:37:18.813 に答える
1

これは、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
于 2009-06-10T17:39:40.667 に答える
0

SQL 2008 では、テーブル値パラメーターを使用できます。

SQL 2005 では、リストを XML として渡し、プロシージャで XML 処理を使用して XML をテーブル変数に細分化する場合を除き、動的 SQL を使用する必要があります。

于 2009-06-10T17:29:54.460 に答える
0

@temp テーブルを宣言し、値をそれに分割します。その後、あなたはすることができます

select * from Studio s inner join @temptable tb on s.ID=tb.ID

于 2009-06-10T17:31:00.277 に答える