【发布时间】:2019-02-20 03:49:07
【问题描述】:
最近,我们监测到一个关于SQL Server会话块的非常奇怪的问题,在存储过程中的循环代码块中使用了一个用于字符串拆分过程的标量函数,我们检查了代码,没有任何操作在数据库表上,为什么其他会话被调用该函数的会话阻塞?
这里是函数定义:
CREATE function [dbo].[splits](@SourceSql varchar(max), @StrSeprate varchar(10), @y int)
returns varchar(max) as
begin
declare @i int
declare @idx int
declare @s varchar(max)
if(right(@SourceSql,1)!=@StrSeprate)begin
set @SourceSql=@SourceSql+@StrSeprate
end
set @idx=0
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
set @s=left(@SourceSql,@i-1)
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
set @idx=@idx+1
if (@idx=@y) begin
break
end
set @s=null
end
return @s
end
【问题讨论】:
-
"有一个用于字符串拆分过程的标量函数" - 这是您的第一个问题,但信息太少,无法更全面地回答。
-
UDTT 和表值参数在产品中已经存在了十多年。为什么您仍然在一个类型 (
varchar(max)) 中传递多个值,而该类型 (varchar(max)) 并非设计 用于保存多个值?
标签: sql-server database-administration sqlperformance