Функция SQL Server внутри оператора Select и тупик транзакции - PullRequest
0 голосов
/ 18 апреля 2019

С кодом, показанным ниже, я получаю тупик транзакции. Функция 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 голосов
/ 18 апреля 2019

У меня нет ничего конкретного, чтобы сказать, что любая часть вашего запроса приведет к тупику транзакции. Но я думаю, что вы можете использовать JOIN, что, на мой взгляд, проще и может вывести вас из неприятных тупиков. Итак, попробуйте это:

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