Ошибка серьезности 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?