SQL Server函数里面有一个Select语句和事务死锁

问题描述 投票:0回答:1

使用下面显示的代码我得到一个事务死锁。 Split函数接受一个字符串并将列表拆分为一个表格,我在其中进行选择。我的活动有READ UNCOMMITTED。我应该将Split放入临时表中,然后用它进行查询吗?

ALTER PROCEDURE [Revisions]
    @ScheduleRevisionIds NVARCHAR(MAX) = NULL
AS
BEGIN
    SET NOCOUNT ON;
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

    IF(@ScheduleRevisionIds IS NOT NULL)
    BEGIN
        -- GET SCHEDULE REVISIONS
        SELECT esr.Id 
        INTO #TempScheduleRevisions
        FROM Revision esr
        WHERE EXISTS (SELECT items 
                      FROM dbo.Split(@ScheduleRevisionIds, ',') 
                      WHERE esr.Id = items) 

功能

ALTER FUNCTION [Split](@String varchar(MAX), @Delimiter char(1))       
returns @temptable TABLE (items varchar(MAX))       
as       
begin       
    declare @idx int       
    declare @slice varchar(MAX)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(@slice)       

        SET @String = right(@String, LEN(@String) - @idx)       
        IF LEN(@String) = 0 BREAK       
    END   
RETURN       
END
sql sql-server stored-procedures stored-functions database-deadlocks
1个回答
0
投票

我没有任何具体的说法查询的任何部分会导致事务死锁。但是,我认为你可以使用我觉得更简单的JOIN,可能会让你摆脱麻烦的僵局。所以,试试这个:

 SELECT esr.Id INTO #TempScheduleRevisions
 FROM 
 Revision esr
 INNER JOIN
 dbo.Split(@ScheduleRevisionIds, ',') sri
 ON
 sri.items = esr.id
© www.soinside.com 2019 - 2024. All rights reserved.