1. 程式人生 > >sql語句循環截取字符串

sql語句循環截取字符串

gpo arc mssq 開始 har mss insert bsp 起點

測試環境 : mssql2016 express

需求 : 拆分字符串執行insert

思路 : 在循環中截取分隔符之間的字符串.起止點位置計算

   起點從0開始startIndex,查找第一個分隔符位置endIndex.下一次循環時,將endIndex+1作為起來,再查找其之後的第一個分隔符位置.直到查找到最後一個分隔符位置.

   當找到最後一個分隔符位置時,下一個止點位置為0循環會結束,而處理不到最後分隔符與字符串結尾處的那個子串,即最後一個單元.所以源字符串起點不含分隔符,但結束時包含.例如:

   A,Sql,C#,public,dynamic, // 用逗號分隔的字符串,起點不含分隔符,但結束時用分隔符結束

 1 DECLARE @string as nvarchar(max) -- 源字符串,子串間用分隔符隔開
 2 DECLARE @spchar as char(1)         -- 分隔符
 3 DECLARE @startIndex as int         -- 起點
 4 DECLARE @endIndex as int         -- 結束點
 5 DECLARE @log as nvarchar(max)     -- 執行記錄
 6 DECLARE @count as int             -- 查找次數
 7 
 8 SET @spchar
=, -- 分隔符 9 -- 源字符串,起點不包含分隔符,結束包含分隔符 10 SET @string=A,Sql,C#,public,dynamic, 11 SET @startIndex=0 -- 0位置為初起點 12 SET @log=‘‘ 13 SET @count=1 14 SELECT @endIndex=CHARINDEX(@spchar,@string);-- 第1個分隔符位置為結束點 15 -- charindex找不到字符串時,返回0.循環成立條件是能找到分隔符 16 WHILE @endIndex>0 17 BEGIN 18 DECLARE
@subStr as nvarchar(20) -- 子字符串 19 -- 根據起止點及起止點之差為長度找出子字符串 20 SELECT @subStr=SUBSTRING(@string,@startIndex,@endIndex-@startIndex) 21 -- 下一起點為當前止點加1 22 SET @startIndex=@endIndex+1 23 -- 查找下一分隔符位置,即新的止點 24 SET @endIndex=CHARINDEX(@spchar,@string,@startIndex); 25 26 SET @log=@log+N | 第+CAST(@count AS VARCHAR)+N次查找到: +@subStr 27 SET @count=@count+1 28 END 29 SELECT @log

執行結果 : | 第1次查找到: A | 第2次查找到: Sql | 第3次查找到: C# | 第4次查找到: public | 第5次查找到: dynamic

sql語句循環截取字符串