1. 程式人生 > >SQL Server自定義字串分割函式——Split

SQL Server自定義字串分割函式——Split

我相信大部分人都碰到過,處理資料的時候,欄位的值是以 ',' (逗號)分隔的形式,所以我也不能避免。

然後我才知道,sql 是沒有類似於 C# 和 Javascript 這種分割字串的方法。( Split )

所以我自己定義了一個 sql 函式(多宣告表值函式),程式碼如下:

複製程式碼
 1 USE [Test]
 2 GO
 3 /****** Object:  UserDefinedFunction [dbo].[Split]    Script Date: 2017/4/14 23:04:08 ******/
 4 SET ANSI_NULLS ON
 5 GO
 6 SET QUOTED_IDENTIFIER ON
 7 GO
 8 CREATE FUNCTION [dbo].[Split](@separator VARCHAR(64)=',',@string NVARCHAR(max))
 9 RETURNS @ResultTab TABLE (
10     Id    INT ,
11     Res     NVARCHAR(500) 
12 )
13 AS
14 BEGIN
15     DECLARE @Num INT
16     
17     IF(@string IS NOT NULL AND @string <> '' AND LEN(@string)>0)
18     BEGIN
19         IF(CHARINDEX(@separator,@string)>0)        --判斷要擷取的字元是否存在
20         BEGIN
21             SET @Num=0
22             WHILE (CHARINDEX(@separator,@string)>0)        --如果要擷取的字元存在,就繼續迴圈
23             BEGIN
24                 SET @
[email protected]
+1 25 26 INSERT INTO @ResultTab(Id,Res) --擷取字串,插入表變數 27 SELECT @Num,LEFT(@string,CHARINDEX(@separator,@string)-1) 28 29 --把已經擷取並插入的字串刪除 30 SET @string=STUFF(@string,1,CHARINDEX(@separator,@string)-1+LEN(@separator),'') 31 END 32 33 --如果最後一個擷取的字串為空,那就不插入了 34 --例如:'123,456,789,' 這樣的字串最後剩下的就是空字串了 35 IF(@string IS NOT NULL AND @string <> '') 36 BEGIN 37 INSERT INTO @ResultTab(Id,Res) 38 SELECT @Num+1,@string 39 END 40 END 41 ELSE 42 BEGIN 43 DELETE FROM @ResultTab 44 END 45 END 46 ELSE 47 BEGIN 48 DELETE FROM @ResultTab 49 END 50 RETURN 51 END
複製程式碼

下面來呼叫一下試試效果:

複製程式碼
1 --因為這個函式建立的時候預設為以 逗號 分割,所以只需要使用 default 關鍵字就可以了
2 select * from Split(default,'123,456,789')
3 
4 select * from Split(default,'123,456,789,')
5 
6 --下面試試其它字元分割
7 select * from Split('abc','11111abc22222abc33333')
8 
9 select * from Split('abc','11111abc22222abc33333abc')
複製程式碼

不足的地方就是不能直接作用於表,和不能同時支援多字元分割。

當然,如果多定義幾個引數,也是勉強可以的,不過我想的是能夠和 C# 那種可以傳入一個分割字元的陣列,不過貌似 sql 自定義函式的引數不支援 table 型別。

另外,如果有什麼好的想法,可以探討一下。多謝~