Почему завершающий SET непоследовательно выдает ошибку в SQL?
-
13-09-2019 - |
Вопрос
Я смотрю на ошибку одного из наших веб-приложений, и оно вызывало хранимую процедуру, отвечающую за обновление записи в базе данных.
Эта хранимая процедура работала несколько недель без проблем.Затем однажды он начал выдавать ошибки, и во время отладки мы обнаружили причину внутри хранимой процедуры.
По сути, там было такое заявление
Begin
// Do Stuff
Set
End
Итак SET
вообще никогда ничего не устанавливал.По какой-то причине это прекрасно работает на нашем сервере и отлично работает на клиентском сервере до сегодняшнего дня, когда он решил начать жаловаться.(Неверная синтаксическая ошибка)
Есть ли какой-либо тип настройки SQL Server, который мог бы вызвать такое внезапное изменение в поведении?
Разъяснение - SET
всегда был в процедурах.И запуск SET
Сам по себе или как единственный оператор в хранимой процедуре действительно работает для меня.В этом проблема, это не должен работа.Итак, есть ли что-нибудь, что могло бы заставить его работать, когда оно должно выйти из строя?
Решение
Процедура с SET
подобное обычно не скомпилируется, даже если SET
невозможно добраться:
alter procedure dbo.testproc as
begin
return 1;
set
end
Incorrect syntax near the keyword 'SET'.
Поскольку изменение не удалось, я не понимаю, как эта процедура вообще могла оказаться в вашей базе данных?
Или, может быть, вы работали в режиме совместимости с SQL Server 2000 (который все еще позволял это). Изменение mdoe совместимости на SQL Server 2005 или более позднюю версию приведет к нарушению процедуры.
Другие советы
Выполнение «SET» само по себе приведет к ошибке.Изначально я собирался предположить, что у вас может быть код ветвления (IF, RETURN, GOTO и т. д.), из-за которого линия никогда не будет достигнута...но я обнаружил, что не могу создать хранимую процедуру, содержащую это как отдельный оператор.
Если вы создадите сценарий процедуры и попытаетесь воссоздать ее (с другим именем), можно ли ее создать?
Возможно, стоит опубликовать этот сценарий или ту его часть, которую вам удобно опубликовать.