Ответ 1
Попробуйте следующее:
RAISERROR('your message here',16,1)
Я столкнулся с известным "Неправильным синтаксисом" при использовании инструкции 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 "" и не может найти решение.
Любые предложения?
Попробуйте следующее:
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
И о
"Неверное утверждение рядом с" ДРОБИРОВКА ".
Попробуйте использовать это, если вы используете более старую версию, чем SQL 2012:
RAISERROR('O associated with the given Q Id already exists',16,1);
Поскольку THROW - это новая функция SQL 2012.
Эта ошибка также может возникнуть, если вы неправильно ее кодируете:
RAISEERROR('your message here',16,1)
Я смотрел на это в течение четырех часов, положив точки с запятой повсюду, прежде чем я понял, что ошибся "RAISERROR"
Как указано во многих ответах, оператор THROW был введен в SQL Server 2012. Поэтому, если вы используете эту версию SQL Server или более поздней версии, рекомендуется использовать THROW, иначе используйте RAISERROR.
Кроме того, перед оператором THROW должно следовать терминатор выражения с точкой с запятой (;). Вот почему вы должны включать точку с запятой перед броском.
Посмотрите на эту статью о Различия между 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
поместите ;
перед ключевым словом THROW
, и он будет работать.