在資料庫開發工作中,經常會遇到需要將字串依特定分隔符號拆分為多行資料的需求。雖然 SQL Server 2016 版本之後內建了 STRING_SPLIT 函數,但在舊版本或特定業務邏輯下,自訂函數仍具彈性。本文分享一個實用的資料表值函數 StringSplit,可將輸入字串依指定分隔符拆分,並回傳資料表格式結果,方便後續查詢與聯集操作。
以下為完整的 T-SQL 建立腳本,可直接在 SSMS 執行:
CREATE FUNCTION [dbo].[StringSplit] (
@str NVARCHAR(MAX),
@spliter NVARCHAR(10)
)
RETURNS @tb TABLE (ch NVARCHAR(256))
AS
BEGIN
DECLARE @Num INT, @Pos INT, @NextPos INT;
SET @Num = 0;
SET @Pos = 1;
WHILE (@Pos <= LEN(@str))
BEGIN
SELECT @NextPos = CHARINDEX(@spliter, @str, @Pos);
IF (@NextPos = 0 OR @NextPos IS NULL)
SELECT @NextPos = LEN(@str) + 1;
INSERT INTO @tb VALUES (RTRIM(LTRIM(SUBSTRING(@str, @Pos, @NextPos - @Pos))));
SELECT @Pos = @NextPos + 1;
END
RETURN;
END
NVARCHAR(MAX) 長度。執行以下查詢:
SELECT * FROM dbo.StringSplit(N'計算機,IT,C#,SQL', N',');
| ch |
|---|
| 計算機 |
| IT |
| C# |
| SQL |
IN 查詢。JOIN 使用。此函數採用 WHILE 迴圈搭配 CHARINDEX 逐段切割,適合中小資料量(< 1 萬筆)。若需處理大量資料,建議改用 XML 解析、JSON 函數(SQL 2016+)或 CLR 函數以提升效能。