建立函數 f_split,接受字串與分隔符,回傳資料表型別結果:
CREATE FUNCTION f_split(@c VARCHAR(2000), @split VARCHAR(2))
RETURNS @t TABLE (col VARCHAR(20))
AS
BEGIN
WHILE (CHARINDEX(@split, @c) > 0)
BEGIN
INSERT @t(col) VALUES (SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1))
SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')
END
INSERT @t(col) VALUES (@c)
RETURN
END
GO
-- 測試
SELECT * FROM dbo.f_split('dfkd,dfdkdf,dfdkf,dffjk', ',')
/* 結果:
col
--------------------
dfkd
dfdkdf
dfdkf
dffjk
*/
函數 get_strarraylength 透過計算分隔符出現次數 + 1 取得元素數量:
CREATE FUNCTION get_strarraylength(
@str VARCHAR(1024), -- 待分割字串
@split VARCHAR(10) -- 分隔符
)
RETURNS INT
AS
BEGIN
DECLARE @location INT, @start INT, @length INT
SET @str = LTRIM(RTRIM(@str))
SET @location = CHARINDEX(@split, @str)
SET @length = 1
WHILE @location <> 0
BEGIN
SET @start = @location + 1
SET @location = CHARINDEX(@split, @str, @start)
SET @length = @length + 1
END
RETURN @length
END
GO
-- 呼叫範例
SELECT dbo.get_strarraylength('78,1,2,3', ',') -- 回傳 4
STRING_SPLIT() 函數,效能更佳,建議優先使用。ROW_NUMBER() 過濾。CHARINDEX 行為。