Исключение 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 ответов


попробуйте с помощью этого:

RAISERROR('your message here',16,1)

Это продолжает происходить в 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) что объясняет эти вопросы в разделе замечаний.


поставить ; до THROW ключевое слово и оно будет работать.


Я использую:

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