Подтвердить что ты не робот

Неправильный синтаксис рядом с 'THROW'

IF @SQL IS NOT NULL
BEGIN
    BEGIN TRY 
        EXEC sp_executesql @SQL
        PRINT 'SUCCESS: ' + @SQL
    END TRY 
    BEGIN CATCH
        SET @ErrorMessage = 
                    N'Error dropping constraint' + @CRLF
                    + 'Table ' + @TableName + @CRLF
                    + 'Script: ' + @SQL + @CRLF
                    + 'Error message: ' + ERROR_MESSAGE() + @CRLF
        THROW  50100, @ErrorMessage, 1;
    END CATCH
END

Когда выполняется CATCH, я получаю следующую ошибку:

Msg 102, уровень 15, состояние 1, строка 257
Некорректный синтаксис рядом с "THROW".

Замена THROW на PRINT @ErrorMessage работает.

Замена переменной @ErrorMessage с литеральной строкой.

В соответствии с документами, THROW, как предполагается, может принимать переменную. Не уверен, что с этим делать.

4b9b3361

Ответ 1

От MSDN:

Заявление перед оператором THROW должно сопровождаться терминатором с точкой с запятой (;).

Ответ 2

Из документации по THROW, Примечания:

За оператором перед оператором THROW должен следовать терминатор точки с запятой (;).

Это хорошая привычка всегда заканчивать свои утверждения точкой с запятой.

Ответ 3

Я просто столкнулся с той же ошибкой, но по совершенно другой причине. Машина, которую я использую, немного старая, но имеет SSMS 2012 (версия, которую представил Throw). Однако фактический сервер SQL - 10.5 (это 2008 R2; см. Https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-compatibility-level) и т.д. команда недействительна

Надеемся, что не будет слишком много примеров десятилетних установок, но дважды проверьте, если вы получаете это, и вы уверены, что ваш синтаксис правильный!