Select语句中的SQL Server函数和事务死锁

时间:2019-04-17 23:37:10

标签: sql sql-server stored-procedures stored-functions database-deadlocks

使用下面显示的代码,我遇到了事务死锁。 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

1 个答案:

答案 0 :(得分:0)

我没有什么可说的疑问,您的查询的任何部分都会导致交易僵局。但是,我认为您可以使用JOIN,我认为这很简单,并且可能使您摆脱麻烦的僵局。所以,试试这个:

{{1}}