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

複数行のデータをストアド プロシージャに渡す

    単一の文字列から複数の値を非常に簡単に分割できます。 「列」を区切るためにコンマを使用し、「行」を区切るためにセミコロンを使用して、次のように文字列をまとめることができるとします:

    foo, 20120101, 26; bar, 20120612, 32
    

    (これは、コロンとセミコロンがデータに自然に出現しないことを前提としています。出現する場合は、他の区切り文字を選択する必要があります。)

    次のような分割ルーチンを構築できます。これには、元の文字列に表示される値の順序を決定できる出力列が含まれます。

    CREATE FUNCTION dbo.SplitStrings
    (
        @List       NVARCHAR(MAX),
        @Delimiter  NVARCHAR(255)
    )
    RETURNS TABLE
    AS
        RETURN (SELECT Number = ROW_NUMBER() OVER (ORDER BY Number),
            Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number, 
            CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
        FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
            FROM sys.all_objects) AS n(Number)
        WHERE Number <= CONVERT(INT, LEN(@List))
            AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
        ) AS y);
    GO
    

    次に、次のようにクエリを実行できます (単純化と説明のために、3 つのプロパティのみを処理していますが、これを 11 または n に推定できます):

    DECLARE @x NVARCHAR(MAX); -- a parameter to your stored procedure
    
    SET @x = N'foo, 20120101, 26; bar, 20120612, 32';
    
    ;WITH x AS 
    (
        SELECT ID = s.Number, InnerID = y.Number, y.Item 
        -- parameter and "row" delimiter here:
        FROM dbo.SplitStrings(@x, ';') AS s
        -- output and "column" delimiter here:
        CROSS APPLY dbo.SplitStrings(s.Item, ',') AS y
    )
    SELECT 
        prop1 = x.Item, 
        prop2 = x2.Item, 
        prop3 = x3.Item
    FROM x 
    INNER JOIN x AS x2 
    ON x.InnerID = x2.InnerID - 1
    AND x.ID = x2.ID
    INNER JOIN x AS x3
    ON x2.InnerID = x3.InnerID - 1
    AND x2.ID = x3.ID
    WHERE x.InnerID = 1
    ORDER BY x.ID;
    

    結果:

    prop1   prop2     prop3
    ------  --------  -------
    foo     20120101  26
    bar     20120612  32
    


    1. SQLステートメントの出力をCSVファイルに書き込む方法は?

    2. where句でローカル変数を使用する代わりに

    3. SQLite Rtrim()のしくみ

    4. PostgreSQLとシーケンシャルデータ