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

SQL Server 2008 :コンマ区切りのリストを入力しますか?

    これが実際の質問に答えていないことはわかっていますが、これを処理するために私が見たすべてのソリューションは、プロシージャに複数の値を渡すことができないという以前の制限を回避するための汚いハックのように感じます. sql-server 2008 でテーブル値パラメーターが導入されて以来、SQL 内で区切られた文字列が必要になる理由がわかりません:

    最初のステップは、値を含む型を作成することです (再利用できるように一般的な名前を使用する傾向があります):

    CREATE TYPE dbo.StringList AS TABLE (Value NVARCHAR(MAX));
    

    次に、プロシージャを作成します:

    CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.StringList READONLY
    AS
        SELECT  Something
        FROM    MyTable
        WHERE   Org + '-' + OrgSub IN (SELECT Value FROM @OrgList);
    
    GO
    

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

    DECLARE @OrgList dbo.StringList;
    INSERT @OrgList VALUES 
        ('2342342', '________', 'A'),
        ('5435354', '________', 'B');
    
    EXECUTE dbo.GetFromTable @OrgList;
    

    SQL フィドル

    これにより、より適切なテーブルを作成する機会さえ与えられます:

    CREATE TYPE dbo.OrgList AS TABLE(Org VARCHAR(10), OrgSub VARCHAR(10));
    
    CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.OrgList READONLY
    AS
        SELECT  Something
        FROM    MyTable
        WHERE   EXISTS
                (   SELECT  1
                    FROM    @OrgList O
                    WHERE   MyTable.Org = o.Org
                    AND     MyTable.OrgSub = o.OrgSub
                );
    
    GO
    

    次に実行します

    DECLARE @OrgList dbo.OrgList;
    INSERT @OrgList VALUES 
        ('2342342', '________'),
        ('5435354', '________');
    
    EXECUTE dbo.GetFromTable @OrgList;
    

    SQL フィドル

    コンマ区切りリストを渡す必要がある場合は、XML 変換を使用して StringList タイプに変換し、同じ手順を使用できますが、テーブル値パラメーターを使用すると、区切り文字列を使用するよりもはるかに柔軟になります。

    DECLARE @S VARCHAR(MAX) = '2342342-________,5435354-________,_______-________';
    
    DECLARE @OrgList dbo.StringList;
    INSERT @OrgList
    SELECT  Y.value('.', 'NVARCHAR(MAX)')
    FROM    (SELECT [X] = CAST(('<X>' + REPLACE(@S, ',' ,'</X><X>')+'</X>') AS XML)) X
            CROSS APPLY X.nodes('X') AS y (Y)
    
    EXECUTE GetFromTable @OrgList
    

    SQL フィドル



    1. Oracle ODBCドライバはOracleクライアントをどのようにロードしますか?

    2. SQL Serverにリンクサーバーログインを追加する(T-SQLの例)

    3. テーブルの列からデータを挿入し、別のテーブルの列に格納します

    4. mysql8でのGROUPBYの使用