Ответ 1
От MSDN:
Заявление перед оператором 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, как предполагается, может принимать переменную. Не уверен, что с этим делать.
От MSDN:
Заявление перед оператором THROW должно сопровождаться терминатором с точкой с запятой (;).
Из документации по THROW, Примечания:
За оператором перед оператором THROW должен следовать терминатор точки с запятой (;).
Это хорошая привычка всегда заканчивать свои утверждения точкой с запятой.
Я просто столкнулся с той же ошибкой, но по совершенно другой причине. Машина, которую я использую, немного старая, но имеет SSMS 2012 (версия, которую представил Throw). Однако фактический сервер SQL - 10.5 (это 2008 R2; см. Https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-compatibility-level) и т.д. команда недействительна
Надеемся, что не будет слишком много примеров десятилетних установок, но дважды проверьте, если вы получаете это, и вы уверены, что ваш синтаксис правильный!