为什么标量函数呼叫字符串拆分会导致会话块



最近,我们监视了有关SQL Server Session块的一个非常奇怪的问题,有一个标量函数用于字符串拆分过程,该函数在存储过程中使用的循环代码块中使用,我们已经检查了该代码,数据库表上没有任何操作,为什么会话被调用函数的会话阻止?

这是函数定义:

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)

相关内容

  • 没有找到相关文章

最新更新