Исключение T-SQL Throw
я сталкиваюсь с известным "неправильным синтаксисом" при использовании THROW
оператор в хранимой процедуре T-SQL. Я погуглил его и проверил вопросы по StackOverflow, но предложенные решения (и, как ни странно, принятые) не работают для меня.
Я изменяю хранимую процедуру следующим образом:
ALTER PROCEDURE [dbo].[CONVERT_Q_TO_O]
@Q_ID int = NULL,
@IDENTITY INT = NULL OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @EXISTING_RECORD_COUNT [int];
SELECT
@EXISTING_RECORD_COUNT = COUNT (*)
FROM
[dbo].[O]
WHERE
[Q_ID] = @Q_ID
IF @EXISTING_RECORD_COUNT = 0
BEGIN
-- DO SOME STUFF HERE
-- RETURN NEW ID
SELECT @IDENTITY = SCOPE_IDENTITY()
END
ELSE
BEGIN
THROW 99001, 'O associated with the given Q Id already exists', 1;
END
END
GO
когда я кодирую этот T-SQL, я получаю сообщение об ошибке
неверное утверждение рядом с 'THROW'. Ожидание разговора, диалога, распространения или Сделки
все решения предлагают поставить точку с запятой либо до "броска", либо после операторов "ELSE BEGIN". Когда я изменяю T-SQL, я просто получаю"неверное утверждение рядом с 'THROW'" ошибка и, похоже, не может найти решение.
какие предложения?
7 ответов
Это продолжает происходить в SQL Server 2014.
я обнаружил, что положить точку с запятой в конце BEGIN помогает.
этот подход имеет ошибку
IF 'A'='A'
BEGIN
THROW 51000, 'ERROR', 1;
END;
и этот подход не имеет ошибок
IF 'A'='A'
BEGIN;
THROW 51000, 'ERROR', 1;
END;
, чтобы решить вашу проблему,
неверное утверждение рядом с 'THROW'. Ожидание разговора, диалога, Распределенная, или транзакция
положите двоеточие перед вашим заявлением броска:
BEGIN
;THROW 99001, 'O associated with the given Q Id already exists', 1;
END
и про
"неверное утверждение рядом с 'THROW'".
попробуйте использовать это, если вы используете более старую версию, чем SQL 2012:
RAISERROR('O associated with the given Q Id already exists',16,1);
потому что THROW-это новая функция SQL 2012.
эта ошибка также может возникнуть, если вы неправильно код это:
RAISEERROR('your message here',16,1)
Как указывалось во многих ответах, оператор THROW был представлен в SQL Server 2012. Поэтому, если вы используете эту версию SQL Server или более позднюю, рекомендуется использовать THROW, иначе используйте RAISERROR.
кроме того, оператор перед оператором THROW должен сопровождаться точкой с запятой (;) оператор terminator. Вот почему вы должны включить точку с запятой перед броском.
посмотрите на эту статью о различия между RAISERROR и THROW в Sql Сервер
Я также хотел бы призвать вас прочитать документацию из MSDN THROW (Transact-SQL) что объясняет эти вопросы в разделе замечаний.
Я использую:
CREATE PROCEDURE dbo.THROW_EXCEPTION @Message VARCHAR(MAX), @Code VARCHAR(MAX) = -1 AS BEGIN
DECLARE @BR VARCHAR(MAX) = CHAR(13) + CHAR(10)
DECLARE @TAB VARCHAR(MAX) = ' '
DECLARE @T TABLE (X BIT)
INSERT INTO @T (X) VALUES (
@BR + @TAB + 'Error! ' + ISNULL(@Message, '{NULL}')
+ @BR + @TAB + 'Code: ' + ISNULL(@Code, '{NULL}')
+ @BR)
END
следующий:
EXEC THROW_EXCEPTION 'Your Message'
-- OR
EXEC THROW_EXCEPTION 'Your Message', 'Error Code'
-- OR
EXEC THROW_EXCEPTION 'Your Message', 123456