下边的函数,实现了象数组一样去处理字符串。

 

调试存储过程时,往往可以用print将存储过程中的变量print出来,

一,用临时表作为数组

 

但是print出来的字符串有一定长度限制,刚才专门试了一下,应该是4000个字符

复制代码 代码如下:

本文出处: 

如果超过4000个字符,超长的字符会被自动截断,这一点应该比较清楚。

create function f_split(@c varchar(2000),@split varchar(2))
returns @t table(col varchar(20))
as
begin
while(charindex(@split,@c)<>0)
begin
insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))
set @c = stuff(@c,1,charindex(@split,@c),”)
end
insert @t(col) values (@c)
return
end
go
select * from dbo.f_split(‘dfkd,dfdkdf,dfdkf,dffjk’,’,’)
drop function f_split

 

 

col

dfkd
dfdkdf
dfdkf
dffjk
(所影响的行数为 4 行)

二、按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。

复制代码 代码如下:

CREATE function Get_StrArrayLength
(
@str varchar(1024), –要分割的字符串
@split varchar(10) –分隔符号
)
returns int
as
begin
declare @location int
declare @start int
declare @length int
set @str=ltrim(rtrim(@str))
set @location=charindex(@split,@str)
set @length=1
while @location<>0
begin
set @start=@location+1
set @location=charindex(@split,@str,@start)
set @length=@length+1
end
return @length
end

调用示例:select dbo.Get_StrArrayLength(‘78,1,2,3′,’,’)
返回值:4

三、按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便

复制代码 代码如下:

CREATE function Get_StrArrayStrOfIndex
(
@str varchar(1024), –要分割的字符串
@split varchar(10), –分隔符号
@index int –取第几个元素
)
returns varchar(1024)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location<>0 and @index>@next
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
end
if @location =0 select @location =len(@str)+1
–这儿存在两种情况:1、字符串不存在分隔符号
2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
return substring(@str,@start,@location-@start)
end

调用示例:select dbo.Get_StrArrayStrOfIndex(‘8,9,4′,’,’,2)
返回值:9

四、结合上边两个函数,象数组一样遍历字符串中的元素

复制代码 代码如下:

declare @str varchar(50)
set @str=’1,2,3,4,5′
declare @next int
set @next=1
while @next<=dbo.Get_StrArrayLength(@str,’,’)
begin
print dbo.Get_StrArrayStrOfIndex(@str,’,’,@next)
set @next=@next+1
end

调用结果:
1
2
3
4
5

1,SQL语句或者存储过程的最大长度(SQL字符串容量)是多少?

对于超过4000的字符串没办法print出来的时候,往往可以选择select
@v_str这种方式,将后台的字符串select出来,然后粘贴出来查看

您可能感兴趣的文章:

  • Mysql字符串截取函数SUBSTRING的用法说明
  • MySQL
    replace函数替换字符串语句的用法
  • mysql获取字符串长度函数(CHAR_LENGTH)
  • 使用MySQL中的AVG函数求平均值的教程
  • 详解Mysql中的JSON系列操作函数
  • Mysql中LAST_INSERT_ID()的函数使用详解
  • mysql函数拼接查询concat函数的使用方法
  • Mysql数据库使用concat函数执行SQL注入查询
  • MySQL笔记之函数查询的使用
  • mysql
    查询数据库中的存储过程与函数的语句
  • MySQL使用集合函数进行查询操作实例详解

  经常有人问,我的SQL语句是拼凑出来的,可能很长,如果太长了,是不是SQL
Server支持不动了?
  SQL语句的或者存储过程的最大长度是65,536 * Network packet
size,那么这个Network packet size是个什么鬼?
  参考如下截图,是网络包的大小,默认是4096个字节,也就是4kb,
  那么默认情况下,SQL语句的最大长度就是65,536 * 4kb =
255.996093MB,接近256MB了,
  因此正常情况下,可以不用顾忌“我的SQL语句太长了,是不是要撑爆SQL
Server了”,但这并不代表我就支持以字符串的形式拼凑出来一个很长的SQL语句的做法。

但是今天发现不好使了,

  图片 1

注意字符串是”aaaaa…………bbbbb”,结尾时bbbbb

  上述配置也可以从配置表中查询

我随意定义一个超级长的字符串,可以看出来len是87049,同时用select @str
给他select 出来

  图片 2

图片 3

 

 

 

但是我从查询结果select
@str的结果中,将这个字符串复制出来之后,字符串的长度就被截断了,我从上面select出来的结果中复制

2,Print 关键字可以打印出来的字符串或者变量的最大字节数是8000

新贴到一个查询窗口中,发现结尾不是上面定义时候的bbbbb,如截图,通过select
len这个字段,发现是长度是43677

  print关键字在print字符串的时候,可以打印出来的字符串的最大长度是8000个字节,如果字符串或者变量的长度超过8000个字节,会被截断,
  这里的8000是字节数,而不是字符数,如果字符串是UNICODE字符,那么打印出来的字符的个数将会是4000,包括肉眼看不到的回车换行。
  因为有人在调试存储过程的时候,发现print出来的东西跟预期的不一致,也不要觉得奇怪!
  如截图,原始字符串的每行都是一样长的,print出来就被截断了,原因就在这里

图片 4

图片 5

图片 6

 

 

 3,SELECT语句查询时候,显示在SSMS表格中的最大字符长度

因为今天遇到了类似的问题,调试存储过程的时候,对于存储过程中处理的字符串,因为print会被截断,那么就select出来,

  这个长度的默认设置时65535,也就是说如果是varchar(max)或者nvarchar(max),结果超出65535个字节的,显示的结果是会被截断的,
  但这并不证明查询结果是错误的,仅仅是没有将结果完全显示在SSMS的表格中而已。
  如果有长字段,在复制查询结果的时候要小心,直接复制很有可能复制的是一个残缺的结果。
  不过测试的时候,倒是跟这里的65535有一点差异。

发表评论

电子邮件地址不会被公开。 必填项已用*标注