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