Sqlserver
 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да възстановя изтритите редове от таблицата на SQL сървъра?

  2. Как да изпълните съхранена процедура от Laravel

  3. Как да инсталирате само компонента SQL Server Management Studio 2008

  4. Как да намеря кои колони нямат никакви данни (всички стойности са NULL)?

  5. операцията не е разрешена, когато обектът е затворен, когато се изпълнява по-разширена заявка