sql >> Databasteknik >  >> RDS >> Sqlserver

Skicka flera rader med data till en lagrad procedur

Du kan dela upp flera värden från en enda sträng ganska enkelt. Säg att du kan bunta ihop strängen så här, med ett kommatecken för att separera "kolumner" och ett semikolon för att separera "rader":

foo, 20120101, 26; bar, 20120612, 32

(Detta förutsätter att kolon och semikolon inte kan förekomma naturligt i data; om de kan, måste du välja andra avgränsare.)

Du kan bygga en delad rutin som denna, som inkluderar en utdatakolumn som låter dig bestämma i vilken ordning värdet visades i den ursprungliga strängen:

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

Sedan kan du fråga det så här (för enkelhetens skull och för illustrationen hanterar jag bara 3 egenskaper men du kan extrapolera detta för 11 eller 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;

Resultat:

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


  1. Lägg till en främmande nyckelrelation mellan två databaser

  2. Valfria kolumner för att filtrera databasposter

  3. Hur man skapar associativa arrayer i Oracle Database

  4. Filuppladdningar långsammare än användarens nätverksuppladdningshastighet på Apache (EC2)