`

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资料全篇

    《SQL Server全方位解析》 SQL Server,作为全球广泛使用的数据库管理系统,是Microsoft公司推出的一款强大且功能丰富的数据存储和管理工具。本资料集合了丰富的学习资源,涵盖了从基础概念到高级应用,旨在帮助...

    Pro SQL Server 2008 Reporting Services.pdf

    ### Pro SQL Server 2008 Reporting Services 关键知识点概览 #### 一、书籍基本信息与作者介绍 《Pro SQL Server 2008 Reporting Services》是一本专注于Microsoft SQL Server 2008 Reporting Services的专业指南...

    SQL Server 2017 查询性能调优

    需要注意的是,本书内容聚焦于T-SQL查询性能调优,并不包含硬件选择、应用程序编码方法、服务器配置(除影响查询调优部分)、SQL Server Integration Services、SQL Server Analysis Services、SQL Server Reporting...

    Pro SQL Server 2008 Service Broker 数据库

    《Pro SQL Server 2008 Service Broker》是针对SQL Server 2008数据库系统中Service Broker特性的深入解析教程。Service Broker是SQL Server的一个重要组件,它为数据库间的异步通信提供了强大的支持,使得分布式...

    SqlServer和Oracle的不同的一些体会

    ### SqlServer和Oracle的不同的一些体会 #### 一、概述 在进行数据库移植的过程中,往往会遇到多种数据库间的迁移问题。本文将基于一次从Sql Server到Oracle的数据库移植经历,分享一些重要的区别与注意事项,旨在...

    SQL Server 7.0 Beta3 Client_Server数据库管理系统.pdf

    3. 数据库安全性:SQL Server 7.0 Beta3提供了多种安全机制,例如警报和响应管理、事件日志记录、SNMP陷阱等,以确保数据库的安全性。 4. 警报和响应管理:管理员可以定义警报响应规则,当事件发生时,SQL Server ...

    sqlserver top ppt

    作者Denny Lee通过这份报告,旨在为读者提供一系列技巧和建议,帮助他们在使用Microsoft SQL Server 2000 Analysis Services构建大型OLAP系统时避免常见陷阱。 企业级OLAP的关键特征是处理大量数据,如每日2000万行...

    Apress Pro ASP.NET for SQL Server

    ### ASP.NET与SQL Server之间的桥梁:《Apress Pro ASP.NET for SQL Server》 #### 一、书籍概述 《Apress Pro ASP.NET for SQL Server》是一本专注于探讨ASP.NET与SQL Server之间联系的专业书籍。该书由Brennan ...

    Defensive_Database_Programming_with_SQL_Server

    ### 防御性数据库编程与SQL Server #### 引言 《防御性数据库编程与SQL Server》一书由Alex Kuznetsov撰写,并由Hugo Kornelis进行了技术审稿,首次由Simple Talk Publishing出版于2010年。本书主要探讨了在SQL ...

    sql server 索引设计与优化

    ### SQL Server 索引设计与优化 #### 索引的重要性 索引在SQL Server数据库性能优化中扮演着至关重要的角色。一个精心设计的索引可以极大地提高查询效率,减少资源消耗,从而显著提升整体系统的响应速度。本文旨在...

    Professional Microsoft SQL Server 2014 Integration Services, Brian Knight

    《Professional Microsoft SQL Server 2014 Integration Services》是由Brian Knight等多位专家合著的一本专业书籍,专注于探讨Microsoft SQL Server 2014中的Integration Services(SSIS)技术。这本书由John Wiley...

    sqlserver编程规范.doc

    SQLSERVER 编程规范是数据库开发中的重要指导原则,旨在确保代码的可读性、可维护性和性能优化。以下是对该编程规范的详细说明: 1. 引言 SQLSERVER 编程规范的制定是为了提供一套统一的编码标准,提高团队协作效率...

    SqlServer 按时间段查询问题

    在SQL Server中,按时间段查询是常见的操作,特别是在数据分析和报表生成中。然而,这种查询有时会遇到一些陷阱,尤其是当我们处理日期时间(datetime)类型的数据时。在本文中,我们将深入探讨这个问题,并提供解决...

    Inside Microsoft SQL Server 2008 - TSQL Querying

    ### 关于《深入微软SQL Server 2008 - T-SQL查询》的知识点解析 #### 一、从过程化编程到集合与逻辑语言 在传统的编程方式中,程序员往往采用过程化的思维方式来解决问题,即按照一系列步骤顺序执行任务。然而,在...

    Moebius for SQL Server安装部署手册.docx

    ### Moebius for SQL Server 安装部署关键知识点解析 #### 概述 《Moebius for SQL Server安装部署手册》是一份专为系统工程师、数据库管理员及日常运维人员设计的技术指南,旨在帮助用户顺利安装并配置Moebius for...

    sql server 2008 t-sql程序员手册

    - **最佳实践**:总结一系列经过验证的T-SQL编程最佳实践,帮助读者避免常见的编程陷阱。 综上所述,《SQL Server 2008 T-SQL程序员手册》涵盖了SQL Server 2008的核心技术和高级特性,不仅适合初学者入门学习,也...

    SQL Server 2012 T-SQL Recipes (高清原版)

    本书《SQL Server 2012 T-SQL Recipes - A Problem-Solution Approach》是一部针对SQL Server 2012的T-SQL编程的实用指南。作者通过问题解决的方法,详细介绍了如何高效使用T-SQL来处理各种数据库操作,包括数据查询...

Global site tag (gtag.js) - Google Analytics