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

Исключение T-SQL Throw

Я столкнулся с известным "Неправильным синтаксисом" при использовании инструкции THROW в хранимой процедуре T-SQL. У меня есть Googled и проверил вопросы по 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 "" и не может найти решение.

Любые предложения?

4b9b3361

Ответ 1

Попробуйте следующее:

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

Ответ 2

Это происходит в SQL Server 2014.

Я обнаружил, что использование полуколоны в конце BEGIN помогает.

Этот подход имеет ошибку

IF 'A'='A'
BEGIN
   THROW 51000, 'ERROR', 1;
END;

И этот подход не имеет ошибки

IF 'A'='A'
BEGIN;
  THROW 51000, 'ERROR', 1;
END;

Ответ 3

Чтобы решить вашу проблему,

Неверный оператор рядом с "ДРОБИ". Ожидая РАЗГОВОР, ДИАЛОГ, РАСПРОСТРАНЕННЫЙ ИЛИ ОПЕРАЦИЯ

поставьте точку с запятой перед выражением throw:

BEGIN
    ;THROW 99001, 'O associated with the given Q Id already exists', 1;
END

И о

"Неверное утверждение рядом с" ДРОБИРОВКА ".

Попробуйте использовать это, если вы используете более старую версию, чем SQL 2012:

RAISERROR('O associated with the given Q Id already exists',16,1);

Поскольку THROW - это новая функция SQL 2012.

Ответ 4

Эта ошибка также может возникнуть, если вы неправильно ее кодируете:

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

Я смотрел на это в течение четырех часов, положив точки с запятой повсюду, прежде чем я понял, что ошибся "RAISERROR"

Ответ 5

Как указано во многих ответах, оператор THROW был введен в SQL Server 2012. Поэтому, если вы используете эту версию SQL Server или более поздней версии, рекомендуется использовать THROW, иначе используйте RAISERROR.

Кроме того, перед оператором THROW должно следовать терминатор выражения с точкой с запятой (;). Вот почему вы должны включать точку с запятой перед броском.

Посмотрите на эту статью о Различия между RAISERROR и THROW на сервере Sql

Я также хотел бы предложить вам прочитать документацию из MSDN THROW (Transact-SQL), которая объясняет эти вопросы в разделе "Примечания".

Ответ 6

Я использую:

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

Ответ 7

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