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