标签: error-handling

XACT_ABORT ON 在 SQL Server 2012 上没有按预期工作?

看起来 XACT_ABORT ON 没有按预期工作。这是一个表和一个插入其中的过程:

CREATE TABLE rain
    (
      rain_time DATETIME ,
      location VARCHAR(100)
    );
GO

CREATE PROCEDURE insert_rain
    @rain_time DATETIME ,
    @location VARCHAR(100)
AS
    BEGIN;
        SET XACT_ABORT ON;
        BEGIN TRANSACTION;
        PRINT 'before insert';
        INSERT  INTO rain
                ( rain_time, location )
        VALUES  ( @rain_time, @location );
        PRINT 'after insert';
        COMMIT;
    END;
GO
Run Code Online (Sandbox Code Playgroud)

我创建了一个触发器来模拟运行时错误:

CREATE TRIGGER rain_no_insert
ON rain
FOR INSERT 
AS
RAISERROR('Cannot insert', 16, 1);
GO
Run Code Online (Sandbox Code Playgroud)

当我调用插入过程时,我确实收到了错误,但执行并没有停止,因为最后一个 PRINT 打印了它的“插入后”消息:

EXEC insert_rain
    @rain_time = '2015-03-30 12:34:56',
    @location = 'Wautoma, WI';

before insert …
Run Code Online (Sandbox Code Playgroud)

sql-server error-handling sql-server-2012

5
推荐指数
1
解决办法
2415
查看次数

RDBMS 中的错误有多少开销?

我的项目中有一个课程。在课堂上我需要做两个内部选择,以知道是否有任何重复,但我认为如果我得到重复错误然后管理它比选择更好。错误开销 Vs。两个内选,哪个?

rdbms error-handling

4
推荐指数
1
解决办法
337
查看次数

Postgres 需要在异常后提交或回滚

只是想了解这里的想法......

错误说明对于其他数据库,您可以在发生 SQLException 后运行其他命令。它写于 2001 年,但从未接触过。我们正在使用 Postgres 和 SQL Server,所以现在我们遇到了这个问题。

假设你有:

start transaction;
create table test(id int primary key);
insert into test values (1);
commit;

-- Following statement throws a SQLException(duplicate key) in
-- PG, SS and ORacle
insert into test values (1);

-- Following statement behaves differently for different DBMS:
-- SS and OR: No error...statement runs fine
-- PG: Another SQLException thrown...must rollback or commit
insert into test values (99);
Run Code Online (Sandbox Code Playgroud)

谁能帮助我理解为什么 Postgres 不允许这样做?或者更好的是,是否有连接标志来改变行为?(我看了看,没有找到任何东西。)

我在上面添加了“开始事务”位以表明它不是自动提交的 tx。

这是一个 …

postgresql transaction error-handling

4
推荐指数
1
解决办法
3万
查看次数

查找导致错误 3930 的确切语句

最近,我一直在 SQL Server 日志中看到错误。

代码:3930 描述:“当前事务无法提交,无法支持写入日志文件的操作。回滚事务。”

使用 SQL Profiler,如何找到导致此错误的确切语句?SQL Profiler 中的哪一列填充了 SQL 错误日志中的“消息”列?不幸的是,我们只在生产中得到这个,所以我需要在那里运行一个尽可能轻量级的跟踪。你们推荐什么来捕获有问题的代码?

sql-server profiler error-handling trace

4
推荐指数
1
解决办法
1万
查看次数

我怎样才能更好地处理不需要的、非错误的情况?

在编写程序时,我偶尔会遇到我想中止程序的情况,即使这种情况不一定会触发错误。

比方说,如果我不希望 John 能够运行这个程序,我会做这样的事情:

IF @UserName = 'John'
BEGIN
    RAISERROR('John, get out', 16, 1);
    RETURN 1;
END
Run Code Online (Sandbox Code Playgroud)

我真的没有一个很好的理由返回 1,它主要是 shell 脚本的残余,我愿意接受更好的方法来做到这一点。

是否有更好的方法来返回错误消息并将控制权返回给调用者,以应对严格来说不是错误的不需要的情况?我对减少字符或代码行数不感兴趣。我只是有一种直觉说“这可能不是解决这个问题的最佳方法”,我很好奇是否有更聪明的方法来做到这一点。

一种替代方法是始终使用TRY/CATCH,因为RAISERROR严重性为 1-19 会将控制权交给 catch 子句。

例子:

BEGIN TRY
    PRINT 'Before RAISERROR';
    RAISERROR('Time for errors', 16, 1);
    PRINT 'After RAISERROR'
END TRY
BEGIN CATCH
    DECLARE @Msg NVARCHAR(255) = ERROR_MESSAGE()
    PRINT 'Inside CATCH'
    RAISERROR(@Msg, 16, 1)
END CATCH
Run Code Online (Sandbox Code Playgroud)

输出:

IF @UserName = 'John'
BEGIN
    RAISERROR('John, get out', 16, 1);
    RETURN 1;
END
Run Code Online (Sandbox Code Playgroud)

缺点:需要TRY/CATCH块的存在。

sql-server error-handling sql-server-2016

4
推荐指数
1
解决办法
789
查看次数

MS SQL Server 2014:哪个存储过程是我的错误?

作为 Microsoft SQL Server 2014 上的一三个一般问题,也许我应该已经知道答案,或者甚至可能曾经知道 -

当我的存储过程运行其他存储过程时,如何找出哪个存储过程的代码产生了错误?

是否有一种特殊的方法来处理来自 Transact-SQL 的错误,以标识给定存储过程中的错误位置?

存储过程中的程序代码能否获得它所在过程的名称?

如果这是唯一的方法,我准备将“SET @MyNameIs = N'HastilyWrittenProcedure”放入程序代码中。然后我可以输入“PRINT @MyNameIs + 'break.'。" 在所有的错误处理程序中。

sql-server stored-procedures error-handling sql-server-2014

4
推荐指数
3
解决办法
521
查看次数

一个脚本中的多组 Quoted_identifier 取最后一个?

我正在使用 SQL Server 2019 并发现了一个奇怪的行为。研究并没有让我走得更远。

有人可以解释这种行为吗?

SET QUOTED_IDENTIFIER ON; 
if ((256 & @@options) = 256) print '1- quoted_identifier is on' else print '1- quoted_identifier is off';
BEGIN TRY 
    if ((256 & @@options) = 256) print '2- quoted_identifier is on' else print '2- quoted_identifier is off';
END TRY 
BEGIN CATCH
    if ((256 & @@options) = 256) print '3- quoted_identifier is on' else print '3- quoted_identifier is off';
    -- SET QUOTED_IDENTIFIER OFF
    -- if ((256 & @@options) = 256) print '4- quoted_identifier …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql error-handling sql-server-2019

4
推荐指数
2
解决办法
84
查看次数

如何忽略存储过程中的sql错误?(不处理)

我有一个要处理的记录列表,游标从表中遍历它们。该过程仅在遇到插入语句时退出,并且失败。有没有办法可以忽略错误并继续处理以下记录?

Cursor C1:对于每条记录:insert into table_t1(col1) values ('...'); <-- 插入语句对于记录 'n' 结束游标失败

我希望它不退出,而是继续从 n+1 处理到光标末尾。

任何帮助表示赞赏。

db2 stored-procedures error-handling

3
推荐指数
1
解决办法
3014
查看次数

使用绑定变量时如何解决错误“ORA:01-006:绑定变量不存在”?

我有一个包含以下结构和数据的表:

create table TEST_TABLE
(
  item_number NUMBER,
  item_name   VARCHAR2(50),
  item_col    VARCHAR2(50),
  item_pol    VARCHAR2(50)
)
Run Code Online (Sandbox Code Playgroud)

样本数据:

item_number |  item_name|  item_col |  item_pol
------------------------------------------------
     1      |   blue    |     b     |   c
     2      |   red     |     d     |   a
     3      |   black   |     e     |   a
     4      |   yellow  |     d     |   b
Run Code Online (Sandbox Code Playgroud)

这是我尝试使用的示例过程bind variables

create or replace procedure test_bind_variable(res         out sys_refcursor,
                                               item_number varchar2,
                                               item_name   varchar2,
                                               item_col    varchar2,
                                               item_pol    varchar2) is

  qry varchar2(8000);

begin

  qry := 'select * from test_table where …
Run Code Online (Sandbox Code Playgroud)

oracle query oracle-11g-r2 plsql error-handling

3
推荐指数
1
解决办法
1万
查看次数

如何在Sql Server上模拟MSG = 0的错误?

我需要在Sql Server上模拟错误:

\n
\xe2\x80\x9cMsg 0, Level 20 A severe error occurred on the current command\xe2\x80\x9d\n
Run Code Online (Sandbox Code Playgroud)\n

因为我们的开发人员必须在应用程序中处理它。

\n

我怎样才能模拟/触发这种错误?(我也可以在我的本地主机上尝试)。

\n

sql-server error-handling

2
推荐指数
1
解决办法
596
查看次数