34,575
社区成员
发帖
与我相关
我的任务
分享
USE pubs
GO
CREATE TABLE TB(COL TINYINT)
GO
ALTER DATABASE pubs SET ANSI_WARNINGS OFF
GO
ALTER DATABASE pubs SET ARITHABORT OFF
GO
/*检查数据库选项是否开启
SELECT DATABASEPROPERTYEX(DB_NAME(),'IsAnsiWarningsEnabled')
SELECT DATABASEPROPERTYEX(DB_NAME(),'IsArithmeticAbortEnabled')
*/
下面两种情况下,两个选项都设为ON或都是OFF时:
--1, 发生算术错误,都没有中断执行,事务成功提交。--???
BEGIN TRAN
INSERT TB SELECT 1
SELECT COL/0 FROM TB --除零错
--INSERT TB SELECT 256 --溢出
PRINT 'ERROR'
COMMIT TRAN
/*
(1 row(s) affected)
Server: Msg 8134, Level 16, State 1, Line 4
Divide by zero error encountered.
ERROR
*/
SELECT * FROM TB
/*
COL
-----------
1
*/
--2, 发生数值类型错误,执行中断, 事务被回滚
BEGIN TRAN
INSERT TB SELECT 1
UPDATE TB SET COL='A'
PRINT 'ERROR'
COMMIT TRAN
/*
(1 row(s) affected)
Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the varchar value 'A' to a column of data type tinyint.
*/
SELECT * FROM TB
/*
COL
----
(0 row(s) affected)
*/
DROP TABLE TB
exec dd
SELECT * FROM TB
查询无结果USE pubs
GO
CREATE TABLE TB(COL TINYINT)
GO
ALTER DATABASE pubs SET ANSI_WARNINGS OFF
GO
ALTER DATABASE pubs SET ARITHABORT OFF
GO
set ansi_nulls on
set ansi_warnings on
--1, 发生算术错误,都没有中断执行,事务成功提交。--???
alter proc dd
as
BEGIN TRAN
INSERT TB SELECT 1
if @@error<>0
begin
raiserror( '发生错误',16,1)
rollback tran
end
--SELECT COL/0 FROM TB --除零错
INSERT TB SELECT 256 --溢出
if @@error<>0
begin
raiserror( '发生错误',16,1)
rollback tran
end
COMMIT TRAN
go
这样就可以!