自己動手豐衣足食,DIY SQL字符串分解函數(shù)Split
前段時間,在做一個可以批量審核或刪除數(shù)據(jù)的功能時,遇到這么個問題:
因為審核或刪除操作是在存儲過程進(jìn)行的,所以,就打算將選中的數(shù)據(jù)的主鍵拼成字符串,傳到存儲過程進(jìn)行分離,再繼續(xù)處理。
C#中和JavaScript中都有相應(yīng)的分離字符串的Split函數(shù),就想當(dāng)然的以為SQL中也會有類似的函數(shù),結(jié)果查了半天的MSSQL幫助文檔,也沒找到。沒辦法,只好自己寫了,在網(wǎng)上搜了下相關(guān)的,看了一兩篇關(guān)于SQL分離字符串的自定義函數(shù)的文章,結(jié)果,有點失望,可能是自己水平差,或者是因為人家的代碼沒寫注釋吧,總之就是看著挺吃力的,還沒看完就決定自己寫了。。。
思路很簡單:在需要分解的字符串中,如果存在指定的分隔符,則將***個分隔符前面的字符串取出,存入表內(nèi),然后在需要分解的字符串中將已取出的字符串及***個分隔符刪除,然后繼續(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)
- --重新設(shè)置原字符串的長度
- Set @intLen = LEN(@strText)
- End
- --如果分離后的原字符串依然不為空,則也應(yīng)該插入表中
- if(LEN(RTRIM(LTRIM(@strText)))>0)
- Begin
- Insert Into @temp (SingleVal) values(@strText)
- End
- End
- return
- END
(分隔符允許是多位的)
按一般的習(xí)慣來說,在組織多個字符串時,一般都是這種寫法:strKeys += strSingleKey + ",";
所以可能最終該字符串可能會以逗號結(jié)尾,如果組織完成后,將結(jié)尾的逗號去掉了,那就不會以逗號結(jié)尾,所以,在循環(huán)分解完成后,如果剩下的原字符串中(去除左右空格后),如果還有內(nèi)容 ,則也應(yīng)該存入表中?! ?/p>
可能我這種寫法不是***的,也可能會有問題,如確實有需要改進(jìn)的,還請指出,不勝感激?。?!
原文鏈接:http://www.cnblogs.com/uphenson/archive/2011/07/18/2109452.html
【編輯推薦】