看起来 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) 我的项目中有一个课程。在课堂上我需要做两个内部选择,以知道是否有任何重复,但我认为如果我得到重复错误然后管理它比选择更好。错误开销 Vs。两个内选,哪个?
只是想了解这里的想法......
此错误说明对于其他数据库,您可以在发生 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。
这是一个 …
最近,我一直在 SQL Server 日志中看到错误。
代码:3930 描述:“当前事务无法提交,无法支持写入日志文件的操作。回滚事务。”
使用 SQL Profiler,如何找到导致此错误的确切语句?SQL Profiler 中的哪一列填充了 SQL 错误日志中的“消息”列?不幸的是,我们只在生产中得到这个,所以我需要在那里运行一个尽可能轻量级的跟踪。你们推荐什么来捕获有问题的代码?
在编写程序时,我偶尔会遇到我想中止程序的情况,即使这种情况不一定会触发错误。
比方说,如果我不希望 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块的存在。
作为 Microsoft SQL Server 2014 上的一三个一般问题,也许我应该已经知道答案,或者甚至可能曾经知道 -
当我的存储过程运行其他存储过程时,如何找出哪个存储过程的代码产生了错误?
是否有一种特殊的方法来处理来自 Transact-SQL 的错误,以标识给定存储过程中的错误位置?
存储过程中的程序代码能否获得它所在过程的名称?
如果这是唯一的方法,我准备将“SET @MyNameIs = N'HastilyWrittenProcedure”放入程序代码中。然后我可以输入“PRINT @MyNameIs + 'break.'。" 在所有的错误处理程序中。
我正在使用 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) 我有一个要处理的记录列表,游标从表中遍历它们。该过程仅在遇到插入语句时退出,并且失败。有没有办法可以忽略错误并继续处理以下记录?
Cursor C1:对于每条记录:insert into table_t1(col1) values ('...'); <-- 插入语句对于记录 'n' 结束游标失败
我希望它不退出,而是继续从 n+1 处理到光标末尾。
任何帮助表示赞赏。
我有一个包含以下结构和数据的表:
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) 我需要在Sql Server上模拟错误:
\n\xe2\x80\x9cMsg 0, Level 20 A severe error occurred on the current command\xe2\x80\x9d\nRun Code Online (Sandbox Code Playgroud)\n因为我们的开发人员必须在应用程序中处理它。
\n我怎样才能模拟/触发这种错误?(我也可以在我的本地主机上尝试)。
\nerror-handling ×10
sql-server ×6
db2 ×1
oracle ×1
plsql ×1
postgresql ×1
profiler ×1
query ×1
rdbms ×1
t-sql ×1
trace ×1
transaction ×1