T-SQL抛出异常

时间:2014-10-15 07:41:39

标签: sql-server tsql throw

在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' ”附近出现“ 不正确的语句”错误,似乎无法找到解决方案。

有什么建议吗?

8 个答案:

答案 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;

这不会显示语法错误消息。