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

SQL Server SP-IN配列リストのパラメーターを渡しますか?

    2005以前では、配列をパラメーターとしてストアード・プロシージャーに渡すことはできませんが、この機能をエミュレートするには、コンマで区切られたIDのリストをVARCHARパラメーターとして渡します。次に、このリストを解析して、各IDを変数テーブルに追加する必要があります。次に、テーブルの結果にINを使用します。これは洗練されたソリューションではありませんが、できる限りのことです。

    DECLARE @List TABLE (ID INT)
    
    INSERT @List VALUES ('123')
    INSERT @List VALUES ('12')
    
    SELECT *
    FROM
        MyTable
    WHERE
        MyTableID IN (SELECT ID FROM @List)
    

    これは、IDのリストを文字列として受け取り、IDのリストをテーブルとして返す関数を作成することによって最もよく達成されます。

    IF EXISTS(
        SELECT *
        FROM sysobjects
        WHERE name = 'ParseIDArray')
    BEGIN
        DROP FUNCTION ParseIDArray
    END
    GO
    
    CREATE FUNCTION [dbo].[ParseIDArray] (@IDList VARCHAR(8000))
    RETURNS
        @IDListTable TABLE (ID INT)
    AS
    BEGIN
    
        DECLARE
            [email protected] VARCHAR(100),
            @LastCommaPosition INT,
            @NextCommaPosition INT,
            @EndOfStringPosition INT,
            @StartOfStringPosition INT,
            @LengthOfString INT,
            @IDString VARCHAR(100),
            @IDValue INT
    
        --SET @IDList = '11,12,113'
    
        SET @LastCommaPosition = 0
        SET @NextCommaPosition = -1
    
        IF LTRIM(RTRIM(@IDList)) <> ''
        BEGIN
    
            WHILE(@NextCommaPosition <> 0)
            BEGIN
    
                SET @NextCommaPosition = CHARINDEX(',',@IDList,@LastCommaPosition + 1)
    
                IF @NextCommaPosition = 0
                    SET @EndOfStringPosition = LEN(@IDList)
                ELSE
                    SET @EndOfStringPosition = @NextCommaPosition - 1
    
                SET @StartOfStringPosition  = @LastCommaPosition + 1
                SET @LengthOfString = (@EndOfStringPosition + 1) - @StartOfStringPosition
    
                SET @IDString =  SUBSTRING(@IDList,@StartOfStringPosition,@LengthOfString)                  
    
                IF @IDString <> ''
                    INSERT @IDListTable VALUES(@IDString)
    
                SET @LastCommaPosition = @NextCommaPosition
    
            END --WHILE(@NextCommaPosition <> 0)
    
        END --IF LTRIM(RTRIM(@IDList)) <> ''
    
        RETURN
    
    ErrorBlock:
    
        RETURN
    
    END --FUNCTION
    

    この関数を使用してIDのリストを取り込むストアドプロシージャを作成する例を次に示します

    IF EXISTS (SELECT * FROM sysobjects WHERE name = 'TestArrayParameter')
    BEGIN
        DROP PROCEDURE TestArrayParameter
    END
    GO
    
    
    
    CREATE PROCEDURE TestArrayParameter
        @ArrayParameter VARCHAR(8000)
    AS
    BEGIN
    
    
        SELECT *
        FROM TestTable123
        WHERE TestTblID IN (SELECT ID FROM [dbo].[ParseIDArray](@ArrayParameter))
    
        -- OR BETTER
    
        SELECT *
        FROM
            TestTable123 test
            INNER JOIN [dbo].[ParseIDArray](@ArrayParameter) list
             ON list.ID = test.TestTblID
    
    END
    GO
    
    CREATE TABLE TestTable123  (TestTblID INT, TestTblVal VARCHAR(50))
    
    INSERT TestTable123 VALUES (3,'Three')
    INSERT TestTable123 VALUES (25,'Twenty Five')
    INSERT TestTable123 VALUES (100,'One Hundred')
    
    DECLARE @IDList VARCHAR(8000)
    
    SET @IDList = '25,100'
    
    EXEC TestArrayParameter @IDList
    
    DROP TABLE TestTable123
    



    1. MySQL Orderby a number、Nulls last

    2. CloudSQLからAWSRDSへのMySQLデータベースの移行

    3. 内部結合のsqlLiteDatabase.query()

    4. Ubuntu16.10でPostgreSQLを9.6から10.0にアップグレードします