最近,我们监视了有关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)