Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Melewati beberapa baris data ke prosedur tersimpan

Anda dapat membagi beberapa nilai dari satu string dengan cukup mudah. Katakanlah Anda dapat menggabungkan string seperti ini, menggunakan koma untuk memisahkan "kolom", dan titik koma untuk memisahkan "baris":

foo, 20120101, 26; bar, 20120612, 32

(Ini mengasumsikan bahwa titik dua dan titik koma tidak dapat muncul secara alami dalam data; jika bisa, Anda harus memilih pembatas lainnya.)

Anda dapat membuat rutin split seperti ini, yang menyertakan kolom keluaran yang memungkinkan Anda menentukan urutan nilai yang muncul dalam string asli:

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

Kemudian Anda dapat menanyakannya seperti ini (untuk kesederhanaan dan ilustrasi, saya hanya menangani 3 properti tetapi Anda dapat memperkirakan ini untuk 11 atau 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;

Hasil:

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. Login gagal untuk pengguna 'NT AUTHORITY\NETWORK SERVICE'

  2. Apakah kueri REPLACE INTO praktik yang baik?

  3. SQL - Pivot table dan group dengan tidak bekerja

  4. Tidak dapat menetapkan nilai default ke variabel lokal di SQL

  5. Dapatkan Beberapa Nilai di Kursor SQL Server