直接把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 漢書,人工半自動轉換了。

Post a comment