Синтаксическая ошибка в транзакции с использованием меток - PullRequest
2 голосов
/ 12 января 2011

У меня есть сохраненный процесс со структурой, подобной следующей

BEGIN TRY
BEGIN TRANSACTION

    IF EXISTS (SELECT Something FROM Somewhere WHERE Something = '123abc')
        GOTO FINISHED

    IF NOT EXISTS (SELECT Something FROM Somewhere WHERE Something = 'abc123')
        SET @ReturnCode = 2

    FINISHED:

    COMMIT TRANSACTION

END TRY
BEGIN CATCH

    ROLLBACK TRANSACTION

END CATCH

Предположим, что GOTO не используется. Я получаю следующие две ошибки

Line 183
Incorrect syntax near 'F'.
Line 183
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 2.

Если я оберну последние IF BEGIN и END, сохраненный процесс будет работать как обычно. Это нормально и заботится о моих проблемах с синтаксисом.

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

Единственное, о чем я могу думать, это то, что в SQL могут быть некоторые настройки, которые включены на одном сервере, но не на другом. У кого-нибудь когда-нибудь было что-то подобное раньше?

Подробнее: проблемный сервер устарел, пакеты обновления не установлены, а на втором сервере установлен пакет обновления 2 (SP2). В настоящее время в процессе обновления. Позже обновлю результаты.

Ответы [ 2 ]

1 голос
/ 13 января 2011

Итак, согласно моему последнему редактированию, я установил пакет обновления 3. Это решило проблему, с которой я столкнулся.

Видимо, это было решено в SP2.См. Следующие ссылки

Ссылка на статью базы знаний для исправления ошибок SP2

Ссылка на конкретную ошибку

0 голосов
/ 12 января 2011

Почему бы не изменить логику первого IF и полностью исключить бессмысленность GOTO?

BEGIN TRY
    BEGIN TRANSACTION

    IF NOT EXISTS (SELECT Something FROM Somewhere WHERE Something = '123abc')
        AND NOT EXISTS (SELECT Something FROM Somewhere WHERE Something = 'abc123')
        SET @ReturnCode = 2

    COMMIT TRANSACTION

END TRY
BEGIN CATCH

    ROLLBACK TRANSACTION

END CATCH
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...