sql >> データベース >  >> RDS >> Sqlserver

可変数のパラメーターを持つストアド プロシージャ

    コンマ区切りのリストとして渡し、分割関数を使用して、結果に対して結合することができます。

    CREATE FUNCTION dbo.SplitInts
    (
       @List       VARCHAR(MAX),
       @Delimiter  CHAR(1)
    )
    RETURNS TABLE
    AS
       RETURN 
       (
           SELECT Item = CONVERT(INT, Item)
           FROM
           (
               SELECT Item = x.i.value('(./text())[1]', 'INT')
               FROM
               (
                   SELECT [XML] = CONVERT(XML, '<i>' 
                        + REPLACE(@List, @Delimiter, '</i><i>') 
                        + '</i>').query('.')
               ) AS a
               CROSS APPLY
               [XML].nodes('i') AS x(i)
           ) AS y
           WHERE Item IS NOT NULL
       );
    

    ストアド プロシージャ:

    CREATE PROCEDURE dbo.doStuff
        @List VARCHAR(MAX)
    AS
    BEGIN
        SET NOCOUNT ON;
    
        SELECT cols FROM dbo.table AS t
            INNER JOIN dbo.SplitInts(@List, ',') AS list
            ON t.ID = list.Item;
    END
    GO
    

    それを呼び出すには:

    EXEC dbo.doStuff @List = '1, 2, 3, ...';
    

    背景、その他のオプション、およびパフォーマンスの比較については、こちらをご覧ください:

    ただし、SQL Server 2016 以降では、STRING_SPLIT() および STRING_AGG() :



    1. SQL Server 2005/2008 動的 SQL を使用せずにパラメーターを指定した Group By ステートメントを使用しますか?

    2. ストアドプロシージャを使用してOracleテーブルにCSVファイルをインポートする

    3. T-SQLを使用してSQLServerのデータベースのサイズを確認する6つの方法

    4. PostgreSQLで一重引用符で囲まれたテキストを挿入する