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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server函数里面有一个Select语句和事务死锁相关的知识,希望对你有一定的参考价值。

使用下面显示的代码我得到一个事务死锁。 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
答案

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

 SELECT esr.Id INTO #TempScheduleRevisions
 FROM 
 Revision esr
 INNER JOIN
 dbo.Split(@ScheduleRevisionIds, ',') sri
 ON
 sri.items = esr.id

以上是关于SQL Server函数里面有一个Select语句和事务死锁的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER里面的with语句有啥作用?用过的师兄请帮忙

sql server表值函数和视图如何一起使用

如何在 Sql Server Compact Edition SELECT 语句中复制 Rank 函数?

sql server 怎样用select语句调用自定义表值函数

sql server中的开窗函数over视图事物

sql server 怎样用select语句调用自定义表值函数