在T-SQL存储过程中使用THROW
语句时,我面临着名的“不正确的语法”。我用Google搜索并检查了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'附近的错误陈述。期待对话,对话,分发或交易
所有解决方案都建议在'THROW'之前或'ELSE BEGIN'之后加上分号。当我修改T-SQL时,我只是在“THROW' ”附近出现“ 不正确的语句”错误,似乎无法找到解决方案。
有什么建议吗?
答案 0 :(得分:40)
这在SQL Server 2014中继续发生。
我发现将分号放在BEGIN的末尾有帮助。
这种方法有错误
IF 'A'='A'
BEGIN
THROW 51000, 'ERROR', 1;
END;
这种方法没有错误
IF 'A'='A'
BEGIN;
THROW 51000, 'ERROR', 1;
END;
答案 1 :(得分:19)
要解决您的问题,
' THROW'附近的错误陈述。期待对话,对话, 分发或交易
在你的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的新功能。
答案 2 :(得分:13)
试试这个:
RAISERROR('your message here',16,1)
答案 3 :(得分:7)
如果您错误地编码,也会发生此错误:
RAISEERROR('your message here',16,1)
我盯着它看了四个小时,在我意识到我拼错了#34; RAISERROR"
之前把分号放在了整个地方。答案 4 :(得分:3)
将;
放在THROW
关键字之前,它会起作用。
答案 5 :(得分:3)
正如许多答案所指出的,THROW语句是在SQL Server 2012中引入的。因此,如果您使用的是此版本的SQL Server或更高版本,建议使用THROW,否则请使用RAISERROR。
此外,THROW语句之前的语句必须后跟分号(;)语句终止符。这就是为什么你必须在投掷前加一个分号。
请查看有关Differences Between RAISERROR and THROW in Sql Server
的文章我还想鼓励您阅读MSDN THROW (Transact-SQL)中的文档,该文档在备注部分解释了这些问题。
答案 6 :(得分:0)
我用:
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 :(得分:0)
感谢您发布此问题。虽然 IDE 给出了语法错误,但我发现它可以编译并运行良好(注意,我使用的是 SQL Server 2106)。
我还发现,如果只需要一个语句,我可以直接使用
ELSE
THROW 99001, 'O associated with the given Q Id already exists', 1;
这不会显示语法错误消息。