自己動手豐衣足食,DIY SQL字符串分解函數(shù)Split
前段時間,在做一個可以批量審核或刪除數(shù)據(jù)的功能時,遇到這么個問題:
因為審核或刪除操作是在存儲過程進行的,所以,就打算將選中的數(shù)據(jù)的主鍵拼成字符串,傳到存儲過程進行分離,再繼續(xù)處理。
C#中和JavaScript中都有相應的分離字符串的Split函數(shù),就想當然的以為SQL中也會有類似的函數(shù),結果查了半天的MSSQL幫助文檔,也沒找到。沒辦法,只好自己寫了,在網上搜了下相關的,看了一兩篇關于SQL分離字符串的自定義函數(shù)的文章,結果,有點失望,可能是自己水平差,或者是因為人家的代碼沒寫注釋吧,總之就是看著挺吃力的,還沒看完就決定自己寫了。。。
思路很簡單:在需要分解的字符串中,如果存在指定的分隔符,則將***個分隔符前面的字符串取出,存入表內,然后在需要分解的字符串中將已取出的字符串及***個分隔符刪除,然后繼續(xù)下一次分解(如果還存在指定的分隔符,就分解)
以下是SQL:
- -- =============================================
 - -- Author: Henson
 - -- Create date: 2011-04-20
 - -- Description: 字符串分離函數(shù)
 - -- =============================================
 - ALTER FUNCTION [dbo].[Split]
 - (
 - @strText varchar(3000),--待分離的原字符串
 - @strSplit varchar(100)--分隔符
 - )
 - RETURNS @temp Table
 - (
 - ID int IDENTITY PRIMARY KEY,
 - SingleVal varchar(1000)
 - )
 - AS
 - BEGIN
 - Declare @intLen int --用來存儲待分離原字符串長度
 - Declare @intSplitLen int --分隔符長度
 - Declare @intIndex int --用來存儲分離字符串在原字符串的位置
 - Declare @strVal varchar(1000)--用來存儲分離出來后的字符串
 - --獲取原字符串的長度
 - Set @intLen = LEN(RTRIM(LTRIM(@strText)))
 - Set @intSplitLen = LEN(RTRIM(LTRIM(@strSplit)))
 - --原字符串不為空,才繼續(xù)分離
 - If(@intLen > 0)
 - Begin
 - --循環(huán)原字符串,直至原字符串被分離完畢
 - While CHARINDEX(@strSplit,@strText)>0
 - Begin
 - --獲取分離字符串在原字符串的位置
 - Set @intIndex = CHARINDEX(@strSplit,@strText)
 - --獲取分離出的字符串,并插入表中
 - Set @strVal = RTRIM(LTRIM(LEFT(@strText,@intIndex-1)))
 - if(LEN(@strVal)>0)
 - Begin
 - Insert Into @temp (SingleVal) values(@strVal)
 - End
 - --分離后,將分離出的字符串(包括分隔符)從原字符串中刪除
 - Set @strText = Substring(@strText,@intIndex+@intSplitLen,@intLen-@intIndex)
 - --重新設置原字符串的長度
 - Set @intLen = LEN(@strText)
 - End
 - --如果分離后的原字符串依然不為空,則也應該插入表中
 - if(LEN(RTRIM(LTRIM(@strText)))>0)
 - Begin
 - Insert Into @temp (SingleVal) values(@strText)
 - End
 - End
 - return
 - END
 
(分隔符允許是多位的)
按一般的習慣來說,在組織多個字符串時,一般都是這種寫法:strKeys += strSingleKey + ",";
所以可能最終該字符串可能會以逗號結尾,如果組織完成后,將結尾的逗號去掉了,那就不會以逗號結尾,所以,在循環(huán)分解完成后,如果剩下的原字符串中(去除左右空格后),如果還有內容 ,則也應該存入表中?! ?/p>
可能我這種寫法不是***的,也可能會有問題,如確實有需要改進的,還請指出,不勝感激?。?!
原文鏈接:http://www.cnblogs.com/uphenson/archive/2011/07/18/2109452.html
【編輯推薦】















 
 
 

 
 
 
 