2009-12-07 5 views
0

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

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

Это в основном было заявление, как этот

Begin 
    // Do Stuff 

    Set 
End 

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

Есть ли какой-либо тип SQL Server, который может вызвать это внезапное изменение в поведении?

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

ответ

3

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

+0

@Andomar, эта процедура работает для меня просто отлично. (Предполагаю, что я создаю его в первую очередь). – Brandon

+0

@Brandon: Какую версию SQL Server вы используете? Каков режим совместимости базы данных? (Свойства базы данных -> Параметры) – Andomar

+1

Я запускаю SQL Server 2005, но совместимость для базы данных установлена ​​на SQL Server 2000. – Brandon

2

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

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

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

+0

@Philip, фактически выполняющий SET сам по себе не генерирует ошибку, по крайней мере, не для меня: P У нас есть код разветвления, но эта же ветка всегда первая выполнена. Это не кромка или что-то еще. Процедура и ветвь, которые вызываются, часто вызываются. – Brandon