在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
執行后的查詢結果為:
注意:本版本的分隔字符串函數則對兩個分隔符連接起來的沒有任何字符的不做任何處理。
