Bạn cần một cách để tách và xử lý chuỗi trong TSQL, có nhiều cách để thực hiện việc này. Bài viết này đề cập đến những CHUYÊN GIA và CON của hầu hết mọi phương pháp:
Mảng và danh sách trong SQL Server 2005 và hơn thế nữa
Bạn cần tạo một hàm chia nhỏ. Đây là cách một hàm phân tách có thể được sử dụng:
SELECT
*
FROM YourTable y
INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value
Tôi thích cách tiếp cận bảng số để tách một chuỗi trong TSQL - Sử dụng Bảng số nhưng có nhiều cách để tách chuỗi trong SQL Server, hãy xem liên kết trước, giải thích các CHUYÊN GIA và CON của mỗi cách.
Để phương pháp Bảng số hoạt động, bạn cần thực hiện thiết lập bảng một lần này, thao tác này sẽ tạo một bảng Numbers
chứa các hàng từ 1 đến 10.000:
SELECT TOP 10000 IDENTITY(int,1,1) AS Number
INTO Numbers
FROM sys.objects s1
CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
Khi bảng Numbers được thiết lập, hãy tạo hàm tách này:
CREATE FUNCTION inline_split_me (@SplitOn char(1),@param varchar(7998)) RETURNS TABLE AS
RETURN(SELECT substring(@SplitOn + @param + ',', Number + 1,
charindex(@SplitOn, @SplitOn + @param + @SplitOn, Number + 1) - Number - 1)
AS Value
FROM Numbers
WHERE Number <= len(@SplitOn + @param + @SplitOn) - 1
AND substring(@SplitOn + @param + @SplitOn, Number, 1) = @SplitOn)
GO
Giờ đây, bạn có thể dễ dàng chia một chuỗi CSV thành một bảng và tham gia vào đó:
select * from dbo.inline_split_me(';','1;22;333;4444;;') where LEN(Value)>0
ĐẦU RA:
Giá trịValue
----------------------
1
22
333
4444
(4 row(s) affected)
để tạo cho bạn bảng mới, hãy sử dụng cái này:
--set up tables:
DECLARE @Documents table (DocumentID varchar(500), SomeValue varchar(5))
INSERT @Documents VALUES ('1,2,3,4','AAA')
INSERT @Documents VALUES ('5,6' ,'BBBB')
DECLARE @NewDocuments table (DocumentID int, SomeValue varchar(5))
--populate NewDocuments
INSERT @NewDocuments
(DocumentID, SomeValue)
SELECT
c.value,a.SomeValue
FROM @Documents a
CROSS APPLY dbo.inline_split_me(',',a.DocumentID) c
--show NewDocuments contents:
select * from @NewDocuments
ĐẦU RA:
DocumentID SomeValue
----------- ---------
1 AAA
2 AAA
3 AAA
4 AAA
5 BBBB
6 BBBB
(6 row(s) affected)
nếu bạn không muốn tạo bảng Numbers và đang chạy SQL Server 2005 trở lên, bạn chỉ có thể sử dụng hàm tách này (không yêu cầu bảng Numbers):
CREATE FUNCTION inline_split_me (@SplitOn char(1),@String varchar(7998))
RETURNS TABLE AS
RETURN (WITH SplitSting AS
(SELECT
LEFT(@String,CHARINDEX(@SplitOn,@String)-1) AS Part
,RIGHT(@String,LEN(@String)-CHARINDEX(@SplitOn,@String)) AS Remainder
WHERE @String IS NOT NULL AND CHARINDEX(@SplitOn,@String)>0
UNION ALL
SELECT
LEFT(Remainder,CHARINDEX(@SplitOn,Remainder)-1)
,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(@SplitOn,Remainder))
FROM SplitSting
WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)>0
UNION ALL
SELECT
Remainder,null
FROM SplitSting
WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)=0
)
SELECT Part FROM SplitSting
)
GO