sql-server - T-SQL 抛出异常

标签 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 代码时,我收到一条错误消息

Incorrect statement near 'THROW'. Expecting CONVERSATION, DIALOG, DISTRIBUTED, or TRANSACTION

所有解决方案都建议在“THROW”之前或“ELSE BEGIN”语句之后放置分号。当我修改 T-SQL 时,我只是收到“'THROW'附近的错误语句”错误,并且似乎找不到解决方案。

有什么建议吗?

最佳答案

这种情况在 SQL Server 2014 中继续发生。

我发现将分号放在 BEGIN 末尾会有所帮助。

这种方法有错误

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

而且这种方法没有错误

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

关于sql-server - T-SQL 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26377065/

相关文章:

Java异常处理: catch an exception thrown by an external dependency module

sql - 将 CONTAINS 与变量 sql 一起使用

sql-server - Powershell Invoke-Sqlcmd to DataTable rowcount 在其 1 条记录时不正确

sql-server - 尝试同时运行 Delete 语句时,KEY Lock 上的 SQL Server 死锁

java - 如何在 java 中再次抛出 IOException?

java - 抛出接口(interface)中未定义的异常

sql - MSSQL 到 MySQL API 转换层

sql-server - 如何从MSSQL调用存储过程到grails

tsql - 日志备份失败的捕获错误数

sql - 使用动态变量名创建 SQL 表