sql >> Database teknologi >  >> RDS >> Sqlserver

Overførsel af flere rækker af data til en lagret procedure

Du kan nemt opdele flere værdier fra en enkelt streng. Lad os sige, at du kan samle strengen sådan her ved at bruge et komma til at adskille "kolonner" og et semikolon til at adskille "rækker":

foo, 20120101, 26; bar, 20120612, 32

(Dette forudsætter, at koloner og semikoloner ikke kan forekomme naturligt i dataene; hvis de kan, bliver du nødt til at vælge andre afgrænsningstegn.)

Du kan bygge en opdelt rutine som denne, som inkluderer en outputkolonne, der giver dig mulighed for at bestemme rækkefølgen værdien optrådte i den originale streng:

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

Så kan du forespørge det på denne måde (for overskuelighed og illustration håndterer jeg kun 3 egenskaber, men du kan ekstrapolere dette til 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;

Resultater:

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


  1. DATE_FORMAT i en forespørgsel i CodeIgniter, der bruger Active Record, virker ikke

  2. php white screen of death

  3. PHP Ingen database valgt

  4. Hvad forårsager Spring Boot Fejlsikker oprydning (samlinger).