SQL Server 分隔字符串函數實現


在SQL Server中有時候也會遇到字符串進行分隔的需求。平時工作中常常遇到這樣的需求,例如:人員數據表和人員愛好數據表,一條人員記錄可以多多人員愛好記錄,而往往人員和人員愛好在界面展示層要一並提交入庫的,至於實現該需求我大多采用兩種方式:一種方式是代碼先實現一條人員記錄的添加或修改時,在數據訪問層針對人員還好記錄的循環添加或修改;還有一種通過存儲封裝,代碼將選中的人員愛好記錄標識鍵以分隔符連接起來作為字符串集,在存儲過程中在分割字符串集,實現批量插入(注意:所舉例說明有可能不完全妥當,如果博友指出不妥、錯誤以及建議,萬分感謝)。

 
SQL Server分隔字符串函數實現,T-SQL代碼如下:
 1 IF OBJECT_ID(N'[dbo].[ufn_SplitToTable]', N'TF') IS NOT NULL
 2 BEGIN
 3     DROP FUNCTION [dbo].[ufn_SplitToTable];
 4 END
 5 GO
 6  
 7 --==================================
 8 -- 功能:分隔關鍵字字串集插入數據表
 9 -- 作者: XXXX
10 -- 創建: XXXX-XX-XX
11 -- 修改: XXXX-XX-XX XX XXXXX
12 -- 調用:SELECT * FROM dbo.ufn_SplitToTable2('1|2|3','|')
13 --==================================
14 CREATE FUNCTION [dbo].[ufn_SplitToTable]
15 (
16     @chvnKeyWords NVARCHAR(4000),        -- 要分隔的關鍵字字符串集
17     @chvnSeparator NCHAR(1)                -- 要使用的分隔符,默認為'|'
18 ) RETURNS @tblResult TABLE (
19     Num INT IDENTITY(1, 1) NOT NULL,
20     Word NVARCHAR(200) NOT NULL
21 )
22     --$Encode$--
23 AS
24 BEGIN
25     -- 分隔符參數為NULL時則使用"|"            
26     SET @chvnSeparator = ISNULL(@chvnSeparator, N'|');
27  
28     DECLARE @intPos AS INT = 0;
29     SET @intPos = CHARINDEX(@chvnSeparator, @chvnKeyWords);
30  
31     WHILE @intPos >= 1 /* @intPos > 0*/
32     BEGIN
33         IF @intPos >= 2 /*@intPos > 1*/
34         BEGIN
35             INSERT INTO @tblResult (Word) 
36             VALUES (LEFT(@chvnKeyWords, @intPos - 1));
37         END
38  
39         -- 也可以使用SUBSTRING字符串函數 
40         --SET @chvnKeyWords = SUBSTRING(@chvnKeyWords, @intPos + 1, LEN(@chvnKeyWords) - (@intPos + 1) + 1);
41  
42         SET @chvnKeyWords = STUFF(@chvnKeyWords, 1, @intPos, N'');
43         SET @intPos = CHARINDEX(@chvnSeparator, @chvnKeyWords);
44     END
45  
46     IF @chvnKeyWords > N''
47     BEGIN
48         INSERT INTO @tblResult (Word) 
49         VALUES(@chvnKeyWords);
50     END
51  
52     RETURN;
53 END
54 GO

執行以上函數的T-SQL代碼如下:

1 SELECT *
2 FROM dbo.ufn_SplitToTable(N'ab,bc,cc,bb,cd', N',');
3 GO

得到的查詢結果如下:

 
像下面這樣的T-SQL代碼:
1 SELECT *
2 FROM dbo.ufn_SplitToTable(N',,1,2,3,6,8,,9,', ',');
3 GO

執行后的查詢結果為:

 
 
注意:本版本的分隔字符串函數則對兩個分隔符連接起來的沒有任何字符的不做任何處理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM