sql语句循环截取字符串

测试环境 : 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

原文地址:https://www.cnblogs.com/mirrortom/p/8496334.html

时间: 2024-11-14 10:41:04

sql语句循环截取字符串的相关文章

sql语句中截取字符串

今天在开发过程中因为要用到合并单元格,在程序里实现了以后,查出来的数据太长,都把格式撑大了,后来想想可以在sql语句查询的时候就截取,就去网上找了一下,挺好用,就转了过来: 合并单元格: /// <summary>    /// 合并GridView中某列相同信息的行(单元格)    /// </summary>    /// <param name="GridView1">GridView</param>    /// <para

SQL Server中截取字符串常用函数

SQL Server 中截取字符串常用的函数: 1.LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要截取最左边的字符数' ) 返回从字符串左边开始指定个数的字符 select LEFT('SQL_Server_2008',4 ); 返回结果:SQL_ 2.RIGHT ( character_expression , integer_expression ) 函数说明:RIGHT ( '源字符串'

解决存储过程中拼接的SQL字符串超长导致sql语句被截取的问题

今天遇到了一个奇葩的问题:存储过程中的sql字符串拼接的太长,超出了分页存储过程执行sql参数的nvarchar(4000)的长度. 没办法,只能修改自己的存储过程,因为分页存储过程是不能动的. 开始想到的方法是将里层的select语句抽出来,用exec(strInnerSql)执行,将查询胡来的数据放到临时表中,在@s中用临时表获取数据,结果以时报告终 错误原因:执行@s语句的时候找不到执行exec(strInnerSql)产生的临时表 好郁闷啊,怎么会这样呢,明明在一个存储过程中执行的,怎么

Java循环截取字符串,存储到list中

字符串截取  存到list中 使用base转换文件 存储可能会用到 public void demo() { String str = "ABCDEFGfdsdgdgdgdH1f"; List<String> list = new ArrayList<String>(); String streee = ""; int len = str.length(); int sub = 3; if (len % sub != 0) { for (in

SQL Server 中截取字符串常用的函数

1.LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要截取最左边的字符数'  ) 返回从字符串左边开始指定个数的字符 select LEFT('SQL_Server_2008',4 ); 返回结果:SQL_ 2.RIGHT ( character_expression , integer_expression ) 函数说明:RIGHT ( '源字符串' , '要截取最右边的字符数'  ) 返回字符串

Sql语句循环插入数据

--循环执行插入100000条数据 declare @ID intbeginset @ID=1while @ID<=100000begininsert into table(ID)values(@ID)set @[email protected]+1endend 原文地址:https://www.cnblogs.com/m903277683/p/12073743.html

SQL语句の循环添加数据

declare @i intset @i=1while @i<=1000begininsert into News_ITM(title,msg,subDateTime,author,imagePath) values('TITLE'+cast(@i as nvarchar(50)),'内容'+cast(@i as NCHAR),GETDATE(),'admin',null)set @i = @i +1end

一条sql语句循环插入N条不同记录(转)

SET NOCOUNT ON IF (OBJECT_ID('TB' ) IS NOT NULL ) DROP TABLE TB GO CREATE TABLE TB(ID INT IDENTITY (1,1),NAME VARCHAR(40)) GO INSERT INTO TB(NAME) SELECT 'KK'+CONVERT(VARCHAR(5),isnull(@@IDENTITY,0)+1) GO 10 --GO 后面为执行的次数 SET NOCOUNT OFF SELECT * FRO

DOS命令(cmd)批处理:替换字符串、截取字符串、扩充字符串、获取字符串长度

1.替换字符串,即将某一字符串中的特定字符或字符串替换为给定的字符串.举例说明其功能:========================================= @echo off set aa=伟大的中国!我为你自豪! echo 替换前:%aa% echo 替换后:%aa:中国=中华人民共和国% echo aa = %aa% set "aa=%aa:中国=中华人民共和国%" echo aa = %aa% pause ==============================