Ошибка серьезности 17 в SQL Server 2014 после обновления

У меня есть процесс, который выполняется на старом настольном ПК под управлением SQL Server 2008 R2, который занимает 1 день 22 часа (Windows Server 8 - Intel Xenon E5530@ S2,4 ГГц. 3,91 ГБ ОЗУ).

В попытке ускорить этот процесс я приобрел тестовую версию SQL Server 2014, работающую на Windows Server 2012 (процессор Xeon Silver 4116 2,10 ГГц с 24 ГБ ОЗУ).

Когда я выполняю ранее медленно работающую хранимую процедуру на новом сервере, я получаю следующую ошибку:

Сообщение 18054, Уровень 16, Состояние 1, Процедура usp_ServiceAlgorithimV2_Stage1, Строка 60 [Стартовая Строка 3]
Ошибка 1653, уровень серьезности 17, состояние 1 возникла, но в sys.messages не было найдено сообщений с таким номером ошибки. Если ошибка больше 50000, убедитесь, что пользовательское сообщение добавлено с использованием sp_addmessage.

Кажется, я не могу понять, что означает эта ошибка и что я могу с этим сделать.

Хранимая процедура в вопросе курсоров над 37426615 строк, используя CURSOR FOR,

Внутри курсора я беру varchar из строки и использовать его в полнотекстовом запросе к таблице, содержащей 336 строк.

Затем я сохраняю совпадения во временной таблице @Table принятие решения на основе количества возвращенных строк и DELETE FROM @Table,

Проблема не может быть с каталогом FT, так как в момент возникновения ошибки 5 674 478 были найдены и записаны во временную таблицу:

DECLARE @tempT TABLE (ID INT, ServiceID INT)    

DECLARE @ID INT, @service VARCHAR(500), @serviceid INT,
        @categoryid INT, @TopCategoryid INT, @NumResults INT,
        @ServiceName VARCHAR(500), @sql VARCHAR(4000), 
        @weight_value FLOAT, @weight_term VARCHAR(150),
        @sqlIsABout VARCHAR(4000), @supplier VARCHAR(150)

IF(@NumRows IS NULL)
    SET @NumRows = (SELECT COUNT(*) FROM Spend)

DECLARE db_cursorCat CURSOR STATIC FOR
    --get all spend items that have not been allocated
    SELECT TOP (@NumRows) S.SpendID, S.Service, S.Supplier
    FROM Spend S 
    WHERE ISNULL(dbo.RegExReplace( Service,  '[^A-Za-z ,]+', ' '), '')!=''
    --AND NOT EXISTS (SELECT * FROM SpendServiceType_Temp T WHERE T.Spendid = S.SpendID) 

/* Loop over spend items */
OPEN db_cursorCat   

FETCH NEXT FROM db_cursorCat INTO @ID, @service, @supplier

WHILE @@FETCH_STATUS = 0   
BEGIN 
    /* strip non-alphanumeric chars from search string*/
    SET @service = ISNULL(dbo.RegExReplace(LTRIM(@service),  '[^A-Za-z ,]+', ' '), '')

    IF @service != ''
    BEGIN
        INSERT INTO @tempT(ID, ServiceID)
            /* Run free text search on service types using the supplied service  adn insert results into temp table */
            SELECT @ID, S.ServiceTypeID
            FROM ServiceType S
            WHERE FREETEXT (ServiceType, @service)  

            /*check if only result has been found*/  
            SET @NumResults = (SELECT COUNT(*) FROM @tempT)

            IF (@NumResults = 1)
            BEGIN
                /* Insert found service for THIS spend items */
                SET @serviceid = (SELECT TOP 1 ServiceID FROM  @tempT) 
                --
                INSERT INTO dbo.SpendServiceType(SpendID, ServiceTypeID)
                    SELECT @ID, @serviceid
                    WHERE NOT EXISTS (SELECT * 
                                      FROM dbo.SpendServiceType ST  
                                      WHERE ST.SpendID = @ID 
                                        AND ST.ServiceTypeID = @serviceid)
           END
           ELSE
           BEGIN
               /* Add Spend item and found services to table for future processing */
               INSERT INTO [dbo].[SpendServiceType_Temp]([Spendid],[ServiceTypeid])
                   SELECT ID, Serviceid
                   FROM @tempT T
                   WHERE NOT EXISTS (SELECT * 
                                     FROM dbo.SpendServiceType ST 
                                     WHERE T.ID = ST.SpendID 
                                       AND T.ServiceID = ST.ServiceTypeID)
           END

           /*delete temp table ready for next iteration*/
           DELETE FROM @tempT

           SET @service = ''
        END

        FETCH NEXT FROM db_cursorCat INTO @ID, @service, @supplier
    END

    CLOSE db_cursorCat   
    DEALLOCATE db_cursorCat
END

Кто-нибудь знает, что на самом деле означает ошибка и как я могу попытаться отладить ее?

Я понимаю из MSDN, что уровень серьезности 17 ошибок

"Укажите программные ошибки, которые не могут быть исправлены пользователем. Сообщите системному администратору о проблеме".

но это бесполезно для меня.

Почему это работает в SQL Server 2008, но не в SQL Server 2014?

ссылка на SQL на скрипке БД

0 ответов

Другие вопросы по тегам