Почему вызов скалярной функции для разбиения строки может привести к блокировке сеанса? - PullRequest
0 голосов
/ 20 февраля 2019

Недавно мы наблюдали очень странную проблему с блоком сеанса 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

1 Ответ

0 голосов
/ 20 февраля 2019

Эта функция не может вызвать блокировку вашего экземпляра.Вы можете проверить другие предыдущие операции в том же сеансе \ запросе.

Но я могу помочь вам с другой опцией, вместо этой функции.Ниже приведен разделитель для целочисленных значений, но вы можете использовать его и для изменения типа данных.

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)
...