Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truyền nhiều hàng dữ liệu vào một thủ tục được lưu trữ

Bạn có thể tách nhiều giá trị từ một chuỗi đơn lẻ khá dễ dàng. Giả sử bạn có thể nhóm chuỗi như thế này, sử dụng dấu phẩy để phân tách các "cột" và dấu chấm phẩy để phân tách các "hàng":

foo, 20120101, 26; bar, 20120612, 32

(Điều này giả định rằng dấu hai chấm và dấu chấm phẩy không thể xuất hiện tự nhiên trong dữ liệu; nếu có thể, bạn sẽ cần chọn các dấu phân cách khác.)

Bạn có thể xây dựng một quy trình phân tách như thế này, bao gồm một cột đầu ra cho phép bạn xác định thứ tự giá trị xuất hiện trong chuỗi ban đầu:

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

Sau đó, bạn có thể truy vấn nó như thế này (để đơn giản và minh họa, tôi chỉ xử lý 3 thuộc tính nhưng bạn có thể ngoại suy điều này cho 11 hoặc 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;

Kết quả:

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. Chèn dữ liệu vào một dạng xem (SQL Server)

  2. Ngôn ngữ thiết lập MS SQL Toàn cầu- hàm ý?

  3. Cách kiểm soát những gì người dùng có thể giải mã Mã hóa khóa đối xứng SQL Server

  4. Những điều bạn nên biết với NOCHECK khi kích hoạt ràng buộc CHECK trong SQL Server

  5. Nhận số lượng từ các bảng sql