数据库选项ARITHABORT和ANSI_WARNINGS的疑问。

csdyyr 2009-09-10 11:41:12
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

问题是在第一种情况:
1,貌似设置数据库选项不起作用?或者是我哪里写错了?
2,联机丛书说,如果ARITHABORT为ON,当发生算术错误时,查询或批处理中断,如是在事务中,事务被回滚,但现在不是这样?

在SQL 2000,2005测试一样。
...全文
188 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiequan2 2009-10-23
  • 打赏
  • 举报
回复
学习
csdyyr 2009-10-23
  • 打赏
  • 举报
回复
up
billpu 2009-09-10
  • 打赏
  • 举报
回复
幫頂
Rotaxe 2009-09-10
  • 打赏
  • 举报
回复
ARITHABORT ON ANSI_WARNINGS ON仅中止语句。

ARITHABORT ON ANSI_WARNINGS OFF 中止批处理。

ARITHABORT OFF ANSI_WARNINGS ON仅中止语句。

都为OFF继续;
这2个选项并不会影响事务的回滚和提交
华夏小卒 2009-09-10
  • 打赏
  • 举报
回复
是不是要用@@ERROR判断一下

如果正确才提交事务 COMMIT TRAN

否则回滚 ROLLBACK TRANSACTION
华夏小卒 2009-09-10
  • 打赏
  • 举报
回复
学习
guguda2008 2009-09-10
  • 打赏
  • 举报
回复
没测过,帮顶
jiangshun 2009-09-10
  • 打赏
  • 举报
回复
学习
csdyyr 2009-09-10
  • 打赏
  • 举报
回复
问题是为什么发生错误不会中止执行。
soft_wsx 2009-09-10
  • 打赏
  • 举报
回复
exec dd
SELECT * FROM TB
查询无结果
--小F-- 2009-09-10
  • 打赏
  • 举报
回复
学习
soft_wsx 2009-09-10
  • 打赏
  • 举报
回复
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
这样就可以!

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧