【问题标题】:Why a scalar function call for string splitting can lead to session block?为什么对字符串拆分的标量函数调用会导致会话阻塞?
【发布时间】: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


【解决方案1】:

此功能不会导致您的实例阻塞。您可以检查同一 Session\Request 上的其他先前操作。

但是,我可以为您提供其他选项,而不是此功能。下面一个用于拆分整数值,但您也可以用于 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2011-12-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多