SQL UDF-將CSV字串轉成SELECT結果
1 |
直接把CSV轉成可以直接SELECT內容的SQL函數? 我肖想好久了,今天終於動手把它寫出來了。
我原本參考一篇Google到的文章,其中的CTE完全用SELECT搞定的寫法很酷,我曾嘗試改為Table Variable放入UDF,但測試結果不理想,速度慢了一倍(五萬次 22秒 vs 10秒)。最後還是乖乖地用WHILE LOOP實作,程式如下:
ALTER FUNCTION SplitCSV
(
@csv NVARCHAR(4000),
@delm CHAR(1)
)
RETURNS @Result TABLE
(
Element NVARCHAR(4000)
)
AS
BEGIN
DECLARE @p INT, @lastP INT, @quit CHAR(1)
SET @p = 1
SET @lastP = 0
SET @quit = 'N'
WHILE @quit = 'N'
BEGIN
SET @p = CHARINDEX(@delm, @csv, @lastP + 1)
IF (@p = 0)
BEGIN
INSERT INTO @Result VALUES
(SUBSTRING(@csv, @lastP + 1, LEN(@csv) - @lastP))
SET @quit = 'Y'
END
ELSE
INSERT INTO @Result VALUES
(SUBSTRING(@csv, @lastP + 1, @p - @lastP - 1))
SET @lastP = @p
END
RETURN
END
Comments
# by DAVE
我感動到流涙下來了。總算不用 HE 漢書,人工半自動轉換了。