Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przekazywanie wielu wierszy danych do procedury składowanej

Możesz łatwo podzielić wiele wartości z jednego ciągu. Załóżmy, że możesz połączyć ciąg w ten sposób, używając przecinka do oddzielenia „kolumn” i średnika do oddzielenia „wierszy”:

foo, 20120101, 26; bar, 20120612, 32

(Zakłada się, że dwukropki i średniki nie mogą pojawiać się naturalnie w danych; jeśli tak, musisz wybrać inne ograniczniki).

Możesz zbudować taką procedurę podziału, która zawiera kolumnę wyjściową, która pozwala określić kolejność, w jakiej wartość pojawiała się w oryginalnym ciągu:

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

Następnie możesz zapytać o to w ten sposób (dla uproszczenia i ilustracji zajmuję się tylko 3 właściwościami, ale możesz ekstrapolować to na 11 lub 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;

Wyniki:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. INSTR() odpowiednik w SQL Server

  2. Kolejność znajdowania TSQL, która wystąpiła w ciągu 3 kolejnych miesięcy

  3. Jak udostępnić źródło danych między wieloma projektami w usługach Microsoft SQL Server 2005 Reporting Services i zachować wersję zapoznawczą programu Visual Studio?

  4. Ustaw część czasową zmiennej datetime

  5. Najbardziej efektywny sposób przenoszenia wierszy tabeli z jednej tabeli do drugiej