Sql server 为什么字符串拆分的标量函数调用会导致会话阻塞?

Sql server 为什么字符串拆分的标量函数调用会导致会话阻塞?,sql-server,database-administration,sqlperformance,Sql Server,Database Administration,Sqlperformance,最近,我们监控了一个关于SQL Server会话块的非常奇怪的问题,存储过程中的循环代码块中使用了一个用于字符串拆分过程的标量函数,我们检查了代码,没有对数据库表执行任何操作,为什么调用该函数的会话会阻止其他会话 以下是函数定义: CREATE function [dbo].[splits](@SourceSql varchar(max), @StrSeprate varchar(10), @y int) returns varchar(max) as begin declare @i

最近,我们监控了一个关于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

此函数不能导致实例阻塞。您可以在同一会话\请求上检查以前的其他操作

但是,我可以帮助您使用其他选项,而不是此函数。下面的一个用于拆分整数值,但您也可以在更改数据类型时用于VARCHAR

DECLARE @ids NVARCHAR(MAX) = N'115676,115678,115679,115680,115681'
DECLARE @input_xml XML
SELECT @input_xml = Cast('<root><x>'+ Replace(@ids, ',', '</x><x>')+ '</x></root>' AS XML)    

SELECT f.x.value('.', 'BIGINT') AS Id
FROM @input_xml.nodes('/root/x') f(x)
DECLARE@ids NVARCHAR(MAX)=N'1156761156781156791156815681'
声明@input_xml
选择@input_xml=Cast(''+Replace(@ids',','')+''作为xml)
选择f.x.value('.','BIGINT')作为Id
来自@input_xml.nodes('/root/x')f(x)

“字符串拆分过程中有一个标量函数”-这是您的第一个问题,但信息太少,无法更全面地回答。UDTT和表值参数在产品中已经存在十多年了。为什么您仍然在一个不是为保存多个值而设计的类型(
varchar(max)
)中传递多个值?