Почему завершающий SET непоследовательно выдает ошибку в SQL? - PullRequest
0 голосов
/ 07 декабря 2009

Я смотрю на ошибку одного из наших веб-приложений, и он вызывал хранимую процедуру, которая отвечала за обновление записи в базе данных.

Эта хранимая процедура работала неделями без проблем. Затем однажды он начал выдавать ошибки, во время отладки мы обнаружили причину внутри хранимой процедуры.

В основном это было утверждение, подобное этому

Begin
  // Do Stuff

  Set
End

Так что SET на самом деле никогда ничего не устанавливает. По какой-то причине это прекрасно работает на нашем сервере и работало на клиентском сервере до сегодняшнего дня, когда он решил начать жаловаться. (Неверная синтаксическая ошибка)

Существуют ли какие-либо настройки SQL Server, которые могли бы вызвать это внезапное изменение поведения?

Разъяснение - SET всегда был в процедурах. И выполнение SET само по себе или как единственное утверждение в хранимой процедуре на самом деле работает для меня. Это проблема, это не должно работать. Так есть ли что-нибудь, что могло бы заставить его работать, когда он должен был выйти из строя?

Ответы [ 2 ]

3 голосов
/ 07 декабря 2009

Процедура с 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 или более позднюю версию нарушит эту процедуру.

2 голосов
/ 07 декабря 2009

Выполнение «SET» само по себе приведет к ошибке. Первоначально я собирался предложить, чтобы у вас мог быть код ветвления (IFs, RETURNs, GOTO и т. Д.), Который привел к тому, что строка никогда не будет достигнута ... но я обнаружил, что не могу создать хранимую процедуру, которая содержит это как одно заявление.

Если вы запишете процедуру и попытаетесь воссоздать ее (с другим именем), можно ли ее создать?

Может быть стоит опубликовать этот сценарий или столько, сколько вам удобно, обнародовать.

...