[MSSQL] 自己寫SQL Server的Split()函數

[MSSQL] 自己寫SQL Server的Split()函數

雖然網路上已經有很多現成的輪子可以直接拿來套,不過還是自己寫過一遍比較清楚背後原理


CREATE FUNCTION udf_Split 
( @Words nvarchar(MAX)/*原始字串*/
, @splitStr varchar(50) /*分割字元*/
)
RETURNS @Result_Table TABLE
	   (
		 [word] nvarchar(max) NULL
	   )
BEGIN 
    Declare @TempStr nvarchar(MAX)
    
    WHILE (CHARINDEX(@splitStr,@Words)>0)/*@Words有包含分割字元就一直執行迴圈*/
	BEGIN
		Set @TempStr=SUBSTRING(@Words,1,CHARINDEX(@splitStr,@Words)-1)/*取出最前面的word*/
		Insert into @Result_Table (word) Values (@TempStr)
		
		Set @Words = REPLACE(@Words,@TempStr+@splitStr,'')/*把最前面的word加上分割字元後,取代為空字串再指派回給@Words*/
	END/*End While*/
	
	IF(LEN(RTRIM(LTRIM(@Words)))>0 And CHARINDEX(@splitStr,RTRIM(LTRIM(@Words)))=0) /*@Words有值但沒有分割字元,表示此為最後一個word*/
	Begin
	    Set @TempStr=@Words /*取出word*/
	    
		Insert into @Result_Table (word) Values (@TempStr)
	    
	End /*End IF*/

   RETURN /*回傳table變數*/
END

呼叫範例:


/*以逗號為區隔的範例*/
Select * from dbo.udf_Split(N'Hello,World,Shadow,你好',',')--四筆資料

Select * from dbo.udf_Split(N'Shadow',',')--一筆資料

Select * from dbo.udf_Split(N'',',')--沒有資料

Select * from dbo.udf_Split(N'first,',',')--一筆資料(但還是建議前端程式傳過來的字串去掉最後一個分割字元比較好)
Select * from dbo.udf_Split(N'first,     ',',')--一筆資料(但還是建議前端程式傳過來的字串去掉最後一個分割字元比較好)

image