`

SQLServer陷阱

SQL 
阅读更多

本文旨在指出一些在使用SQLServer过程中容易犯的错误, 希望能给您带来帮助.
若没有特殊说明, 本文是指在MS SQLServer 2000简体中文版的默认配置环境中.

一, NULL与布尔数据类型
Transact-SQL中存在Boolean类型, if 后面的表达式的计算结果一般是Boolean类型, 但无法使用 declare 定义Boolean类型的变量.

Boolean数据类型有三种取值, TRUE, FALSE, UNKNOWN, 第3种取值通常会被人忽视从而导致逻辑错误.
默认情况下SET ANSI_NULLS为ON, 在逻辑表达式中如果你忽略了NULL的存在, 结果可能会异于你所想.
例1:

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->declare @a intif (@a > 0) set @a = 1else if not (@a > 0) set @a = 2else set @a = 3


结果@a的值应该是3, 因为NULL>0的值为UNKNOWN, NOT UNKNOWN的值还为UNKNOWN.
例2:

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->declare @a intif @a = null set @a = 1else if @a = null or 1 = 1 set @a = 2else set @a = 3


结果@a的值应该是2, 因为NULL = 0的值为UNKNOWN, UNKNOWN or TRUE的值为TRUE.

二, 运行时错误与自动回滚事务
有些人认为一个批查询在执行中发生了错误, 这个查询就会中止, 其实是错误的.

例1:

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->declare @i intset @i = 1 / 0set @i = 1select @i


结果会先报一个
服务器: 消息 8134,级别 16,状态 1,行 2
遇到被零除错误。
然后输出结果集 1.

例2:

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->set xact_abort ondeclare @i intset @i = 1 / 0set @i = 1select @i


结果只报错, 不会输出结果.

例3:
请在查询分析器中新建连接执行

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->create table table1(id int primary key) begin traninsert into table1 values (1) insert into table1 values (1) insert into table1 values (2) commit tran


第二个insert会产生违反主键约束错误, 但是执行结束后你会发现事务已经提交并且table1中已经有两行记录1与2

例4:

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->set xact_abort oncreate table table2(id int primary key) begin traninsert into table2 values (1) insert into table2 values (1) insert into table2 values (2) commit tran


执行结束后, table2中没有记录, 说明事务已经回滚.

当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误

(如语法错误)不受 SET XACT_ABORT 的影响。
一般批查询中 SET XACT_ABORT 默认为 OFF, 隐式开启的事务如触发器中SET XACT_ABORT 默认为ON

分享到:
评论

相关推荐

    SQL Server里PIVOT运算符的“红颜祸水”

    在我们进入特定问题和陷阱前,首先我想给你下使用SQL Server里的PIVOT能实现什么的一个基本概述。  概述  SQL Server里PIVOT运算符背后的基本思想是在T-SQL查询期间,你可以旋转行为列。运算符本身是SQL Server ...

    SQL Server里PIVOT运算符的”红颜祸水“

    在我们进入特定问题和陷阱前,首先我想给你下使用SQL Server里的PIVOT能实现什么的一个基本概述。  概述  SQL Server里PIVOT运算符背后的基本思想是在T-SQL查询期间,你可以旋转行为列。运算符本身是SQL Server ...

    ASP.NET编程之道.part1.rar

    谬误10 .NET和SQL Server中“空值”是一回事 谬误11 C#的结构和C++的完全一样 谬误12 方法中只有引用类型的参数才能实现引用传递 谬误13 字符串是值类型 谬误14 数据绑定表达式中Eval功能等价于Bind 谬误15 .Net中的...

    Kiwi-Syslog-Server-9.5.0,带安装说明

    Kiwi Syslog Server是一个免费的Windows平台上的syslog守护进程。它接收,记录,显示和转发系统日志,如路由器,防火墙,交换机,Unix主机和其他功能的设备主机的syslog消息。有许多可供自定义的选项。其特点包括PIX...

    SIMProx:SNMP代理服务,用于代理转发和数据库操作目标

    SQL Server(推荐) MySQL Oracle PostgreSQL SQLite(不建议用于大型部署)-包括在内。 请注意,数据库是本地配置元数据所必需的,但也可以用作数据库操作的目标。 但是,目标操作数据库和元数据数据库可以不同...

    datasource-test-bff:Apollo Server具有用于不同用例的各种数据源,包括REST,SQL,MongoDB和CosmosDB。 与Knex和Objection ORM集成以进行SQL查询

    该项目是使用Apollo Server的datasource-sql程序包创建的,以手动链接到Postgres数据库。使用异议和Knex的理由异议对于CRUD操作和稍微复杂的查询非常有用。当需要完全定制/复杂的查询时,可以直接使用knex。这种...

    citrix 中文管理操作手册

    配置 SQL Server 数据库以便进行配置日志记录 150 配置 Oracle 数据库以便进行配置日志记录 151 设置“配置日志记录”属性 151 设置“配置日志记录”属性 151 委派“配置日志记录”管理 152 使用配置日志 152 查看...

    todo:一个简单的清单待办应用程序。 后端使用json-server,前端使用vue

    它使用 json-server 作为后端。 还有前端的vue。 Bootstrap 用于构建接口。 我决定不使用路由器只是为了保持简单。 事后看来,要进一步改进应用程序,这是拼图的关键部分。运行项目npm 安装。 npm 运行服务。 npm ...

    Access+2000中文版高级编程

    8.11.1 性能调整的陷阱 232 8.11.2 诊断慢速查询 232 8.11.3 用查询设计网格以解决模糊字段的引用问题 233 8.12 使用分析器向导 233 8.12.1 表分析器向导 234 8.12.2 性能分析器向导 234 8.12.3 文档...

    Access 2000中文版高级编程(part1)

    8.11.1 性能调整的陷阱 232 8.11.2 诊断慢速查询 232 8.11.3 用查询设计网格以解决模糊字段的引用问题 233 8.12 使用分析器向导 233 8.12.1 表分析器向导 234 8.12.2 性能分析器向导 234 8.12.3 文档管理器 ...

    PROJECT 2007宝典 9/9

     17.2.1 SQL Server和分析服务   17.2.2 检查SQL版本   17.2.3 Internet信息服务(IIS)  17.2.4 安装.NET框架3.0   17.3 设置Windows安全账户   17.3.1 Windows SharePoint Services服务账户   ...

    PROJECT 2007宝典 7/9

     17.2.1 SQL Server和分析服务   17.2.2 检查SQL版本   17.2.3 Internet信息服务(IIS)  17.2.4 安装.NET框架3.0   17.3 设置Windows安全账户   17.3.1 Windows SharePoint Services服务账户   ...

    PROJECT 2007宝典 1/10

     17.2.1 SQL Server和分析服务   17.2.2 检查SQL版本   17.2.3 Internet信息服务(IIS)  17.2.4 安装.NET框架3.0   17.3 设置Windows安全账户   17.3.1 Windows SharePoint Services服务账户   ...

    PROJECT 2007宝典 8/9

     17.2.1 SQL Server和分析服务   17.2.2 检查SQL版本   17.2.3 Internet信息服务(IIS)  17.2.4 安装.NET框架3.0   17.3 设置Windows安全账户   17.3.1 Windows SharePoint Services服务账户   ...

    PROJECT 2007宝典 5/9

     17.2.1 SQL Server和分析服务   17.2.2 检查SQL版本   17.2.3 Internet信息服务(IIS)  17.2.4 安装.NET框架3.0   17.3 设置Windows安全账户   17.3.1 Windows SharePoint Services服务账户   ...

    PROJECT 2007宝典 6/9

     17.2.1 SQL Server和分析服务   17.2.2 检查SQL版本   17.2.3 Internet信息服务(IIS)  17.2.4 安装.NET框架3.0   17.3 设置Windows安全账户   17.3.1 Windows SharePoint Services服务账户   ...

    PROJECT 2007宝典 3/9

     17.2.1 SQL Server和分析服务   17.2.2 检查SQL版本   17.2.3 Internet信息服务(IIS)  17.2.4 安装.NET框架3.0   17.3 设置Windows安全账户   17.3.1 Windows SharePoint Services服务账户   ...

    PROJECT 2007宝典 2/9

     17.2.1 SQL Server和分析服务   17.2.2 检查SQL版本   17.2.3 Internet信息服务(IIS)  17.2.4 安装.NET框架3.0   17.3 设置Windows安全账户   17.3.1 Windows SharePoint Services服务账户   ...

    PROJECT 2007宝典 4/9

     17.2.1 SQL Server和分析服务   17.2.2 检查SQL版本   17.2.3 Internet信息服务(IIS)  17.2.4 安装.NET框架3.0   17.3 设置Windows安全账户   17.3.1 Windows SharePoint Services服务账户   ...

Global site tag (gtag.js) - Google Analytics