- SQL语言与数据库操作技术大全
- 马军等编著
- 309字
- 2020-08-26 17:20:24
第2章 Transact-SQL与SQL Server 2005
在上一章介绍了SQL语言的基础知识,传统的SQL语言属于非程序性语言,每一条SQL指令都单独、个别的执行,指令与指令间无法沟通,使用上不如传统的高级程序语言来的方便。因此,MS SQL Server提供了Transact-SQL(T-SQL)语言,除了符合SQL的原有语法规则外,另外增加了变量、程序区块、流程控制等第三代语言的功能,使其应用弹性得到大大的提升。
而MS SQL Server数据库系统的最新版本SQL Server 2005,除了提供非常多的SQL Server 2000版本所没有的功能外,也针对原有的各个部分加以改进以提高质量。在Transact-SQL语言方面,则加入大量的T-SQL标记,以定义或访问其新增功能。同时T-SQL语言本身也增强了数据处理的能力。
本书主要介绍的是Transact-SQL语言,而其运行环境则是SQL Server 2005,因此本章有必要对SQL Server 2005及其中Transact-SQL的运行作一下简单介绍。
2.1 SQL Server 2005及其简单应用
在学习Transact-SQL前,有必要了解一下SQL Server 2005及其集成管理环境。在本节,将主要介绍使用SQL Server 2005提供的集成开发环境创建表、视图,以及使用查询编辑器编辑执行SQL语言。
2.1.1 SQL Server 2005的版本
SQL Server 2005推出了很多版本,其版本越高端,则可用的特性就越多。根据从高端到低端的次序,SQL Server 2005提供了以下的可用版本:
· SQL Server 2005企业版(SQL Server 2005 Enterprise Edition):这个SQL Server版本是针对大型企业的,它们需要更高的可用性以及更高级的功能和商业智能。例如,在这个版本中对CPU和内存数量没有限制,只要操作系统能够处理足够多的CPU和内存数量即可。
· SQL Server 2005开发人员版(SQL Server 2005 Developer Edition):该版本可以让开发人员使用更低廉的价格来开发SQL Server解决方案。开发人员版具有企业版的全部功能,但是只授权用于开发用途。
· SQL Server 2005标准版(SQL Server 2005 Standard Edition):这个SQL Server版本在SQL Server 2005中具有更多的价值。例如,用户现在可以在标准版中通过使用群集、数据库镜像以及集成的64位支持来创建一个具有高可用性的系统。和SQL Server 2005企业版一样,2005标准版也对内存数量没有限制,因此只要操作系统和物理硬件支持,用户可以按照自己的需求来扩展它。不过,标准版最多支持4个CPU。
· SQL Server 2005工作组版(SQL Server 2005 Workgroup Edition):这个新版本针对小型或中型公司,它们需要具有有限商业智能和报告服务的数据库服务器。工作组版最多支持两个CPU,数据库大小则没有限制,内存大小则最多为3GB。
· SQL Server 2005精简版(SQL Server 2005 Express Edition):该版本等同于SQL Server中的桌面版(Desktop Edition,MSDE),不过它进行了一些增强,例如,MSDE不提供任何类型的管理工具,而在2005精简版中则提供了这些工具。此外,精简版还包括了导入和导出向导以及一系列其他的增强。精简版是SQL Server针对小型应用而推出的免费版本。它最大支持4 GB的数据库大小。最重要的是,该版本中删除了查询监督器,使得更多的人可以同时查询实例。
★ 注意 ★
在目前用户广泛使用的Windows XP SP2操作系统中,无法安装SQL Server 2005企业版(SQL Server 2005 Enterprise Edition),但可以安装其他的SQL Server 2005版本。
2.1.2 SQL Server Management Studio
SQL Server 2005将以往的工具大幅集成,例如把Enterprise Manager、Analysis Manager等管理工具及Query Analyzer、MDX(Multi Dimension Expression)和DMX(Data Mining Extension)等语言的编辑工具集成到SQL Server Management Studio。
利用Management Studio可完成很多工作,例如,连接服务的实例以设置服务器属性;可创建和管理各类服务器对象,如数据库、数据表、存储过程、Cube、维度、组件、登录账号和数据库用户权限、报表服务器的目录等。另外,如管理数据库的文件和文件夹、附加或分离数据库、管理安全性、视图存放在文件上的SQL Server系统记录、监视目前的活动、设置复制、管理全文检索索引、视图与设置Agent Services的作业、警报、操作员、Proxy等。
★ 说明 ★
若按照默认安装,Management Studio相关的文件放在C:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE\SqlWb.exe。
单击“开始”|“所有程序”|“Microsoft SQL Server 2005”|“SQL Server Management Studio”命令,即启动了Management Studio工具。
执行Management Studio后,首先要注册一个服务实例,通过“对象资源管理器”窗口左上方的“连接”下拉菜单,选择要加入的服务实例。当单击“连接”按钮后,弹出“连接到服务器”对话框,如图2.1所示。在其中可以指定各项连接信息,如登录的验证方式等。
图2.1 “连接到服务器”对话框
设置了连接信息后,单击“连接”按钮,即连接到数据库服务器,此时Management Studio的界面如图2.2所示。
图2.2 连接到SQL Server 2005服务器
2.1.3 使用Management Studio创建数据库
使用SQL Server 2005,首先需要创建数据库。使用Management Studio可以很方便地创建一个数据库。这里以创建一个Example数据库为例,简单说明其创建过程。
在Management Studio中的对象资源管理器中,右键单击数据库,在弹出菜单中选择“新建数据库”命令,如图2.3所示。
图2.3 选择“新建数据库”命令
此时会弹出如图2.4所示的数据库信息设置窗口,在其中键入需要创建的数据库的名称“Example”,窗口下方会显示创建的数据库文件,用户可以进行相关设置。
设置完毕,单击“确定”按钮,即在数据库服务器中创建了Example数据库,如图2.5所示。
图2.4 数据库信息设置窗口
图2.5 创建的Example数据库
另外,在SQL Server 2005服务器中,默认创建了4个系统数据库:master、model、msdb和tempdb。它们所包含的内容和功能的简单描述如表2.1所示。
表2.1 SQL Server 2005的系统数据库及其功能描述
2.1.4 使用Management Studio创建、查看、编辑表
在关系数据库中,数据以表的形式进行存储。使用Management Studio可以方便地创建、查看和编辑表。下面通过一个具体的客户资料表的创建实例,讲解如何使用Management Studio对数据库表进行操作。
1.表的创建
在Management Studio的对象资源管理器中,展开创建的Example数据库,右键单击“表”,在弹出菜单中选择“新建表”命令,如图2.6所示。
图2.6 选择“新建表”命令
此时在Management Studio的客户窗口中,就可以为表添加列,设置列名、数据类型以及是否允许为空等参数。而表的名称的设置则在右侧的属性窗口中完成,如图2.7所示。
图2.7 创建客户资料表
当客户资料表各列创建完成后,单击“文件”|“保存”命令,则在数据库Example中完成了客户资料表的创建。
2.添加、编辑表中的数据
当表创建完成后,就可以向表中添加数据、存储数据了。利用Management Studio可以方便地向表中键入数据、编辑数据。具体操作步骤如下所示。
在Management Studio的对象资源管理器中,展开Example数据库的表项,会发现新创建的“dbo.客户资料”表。右键单击“dbo.客户资料”表,在弹出菜单中选择“打开表”命令,如图2.8所示。
图2.8 选择“打开表”命令
此时在客户窗口中就打开了客户资料表,在其中就可以查看、添加和编辑表中的数据了,如图2.9所示。
图2.9 编辑表中的数据
2.1.5 使用Management Studio编辑、运行T-SQL语言
在Management Studio内,可以编辑各种查询语法,如SQL、MDX、DMX、XML/A等,而本书则只讨论SQL语言。在集成各种数据语言的编写环境中,Management Studio与以往Query Analyzer不同的是允许离线编写和编辑查询语法。
在Management Studio的语法编写的环境里,不同的关键字会用不同的颜色显示,增强各种语法的可读性。具备众多功能的文字编辑环境,例如,支持查询和替换,自定义字体和颜色,仅执行选取的语法,以不同的颜色体现该行的程序代码是否更改与存储,以及显示行号部分,编辑器类型包含大纲和自动完成之类的其他功能。
下面就介绍一下如何在Management Studio中编辑、运行T-SQL语言。
Management Studio允许在与服务器断开连接时,编写或编辑代码。当服务器不可用或要节省短缺的服务器或网络资源时,这一点很有用。也可以更改查询编辑器与SQL Server新实例的连接,而无须打开新的查询编辑器窗口或重新键入代码。具体步骤如下:
单击“文件”|“新建”|“数据库引擎查询”命令,或者单击工具栏上的“数据库引擎查询”按钮或“新建查询”按钮。
在弹出的“连接到服务器”对话框中,单击“取消”按钮,系统将打开查询编辑器,同时,查询编辑器的标题栏将指示没有连接到SQL Server实例。
在代码窗格中,键入下列Transact-SQL语句:
select * from Example.dbo.客户资料
此时,可以单击“连接”、“执行”、“分析”或“显示估计的执行计划”选项连接到SQL Server实例,执行Transact-SQL语句。在“查询”菜单、查询编辑器工具栏中,或者在“查询编辑器”窗口右键单击时显示的快捷菜单中,均提供了这些选项。
最终执行结果如图2.10所示。
图2.10 编辑、执行Transact-SQL语句
★ 说明 ★
本书的T-SQL实例均是在Management Studio的代码编辑器中编辑、运行的。
2.2 Transact-SQL语言
SQL属于第四代语言(4GL),其执行特点是非过程化,即不用指明执行的具体方法和途径,而是简单地调用相应语句来直接取得结果。显然,这种不关注任何实现细节的语言对于开发者来说有着极大的便利。然而,对于有些复杂的业务流程又要求相应的程序来描述,那么4GL就有些无能为力了。
Transact-SQL是ANSI SQL的加强版语言,它提供了标准的SQL命令,另外还对SQL命令做了许多扩充,提供类似Basic、Pascal、C等第三代语言的基本功能,如变量说明、程序流程控制语言、功能函数等。本节将对Transact-SQL语言作一下简单介绍。
2.2.1 Transact-SQL概述
Transact-SQL是一套定义完善的语言,开发人员可以通过这种语言来进行应用程序和数据库服务器之间的通信,并能够对数据库服务器进行编程处理。Transact-SQL是ANSI SQL的一个超集,利用Transact-SQL,可以使服务器执行一些定制的事务逻辑处理。Transact-SQL由多种应用程序生成,包括:
· 通用办公生产应用程序。
· 使用图形用户界面(GUI)的应用程序,使用户得以选择包含要查看的数据的表和列。
· 使用通用语言语句,确定用户所要查看数据的应用程序。
· 将其数据存储于SQL Server数据库中的商用应用程序。这些应用程序既可以是来自其他厂商的应用程序,也可以是内部编写的应用程序。
· 由开发系统,如Visual C++、Visual Basic或Visual J++等,使用数据库应用程序接口(API),如ADO、OLE DB以及ODBC等,创建的应用程序。
2.2.2 Transact-SQL的标识符
所谓标识符是指由用户定义的SQL Server可识别的、有意义的字符序列。通常用它们来表示名称,如数据库名、表名、视图名称以及列名等。标识符的使用规则如下:
(1)标识符名称不区分大小写,即大小写是等效的。如StudentName等同于STUDENTNAME和studentname。
(2)标识符的长度通常为1~30个字符,不能是保留字。
★ 说明 ★
保留字是一个单词,是SQL词汇的一部分,它只能用在SQL语句中,而不能用于其他任何用途。
(3)标识符第一个字符必须是字母、下画线、@和#开头,从第二个字符开始还可以是数字、$符号。其中:
· 以@、@@开头的是局部、全局变量。
· 以#、##开头的是局部、全局临时对象。
· 包含空格时,要用“[]”或引号括起。
合法标识符如ABC、lili、@VAR_X、#TBL_Y等;而非法标识符如1AB、FROM等。
2.2.3 对象命名规则
与SQL Server 2000不同,在SQL Server 2005中,用户不再拥有对象。它符合SQL-99标准,拥有对象的是schema,而不是用户,数据库中的所有对象都属于某个schema。所有对数据库对象名的Transact-SQL引用可以是由4部分组成的名称,格式如下:
server_name.[database_name].[schema_name].object_name
其中:
· server_name:指定连接的服务器名称或远程服务器名称。
· database_name:如果对象在SQL Server的本地实例中,则指定SQL Server数据库的名称;如果对象在连接服务器中,则database_name将指定OLE DB目录。
· schema_name:如果对象在SQL Server数据库中,则指定包含对象的架构的名称;如果对象在连接服务器中,则schema_name将指定OLE DB架构名称。
★ 说明 ★
在SQL Server 2005中,可以为每个用户分配默认架构。可以使用CREATE USER或ALTER USER的DEFAULT_SCHEMA选项设置和更改默认架构。如果未定义DEFAULT_SCHEMA,SQL Server 2005将假定dbo架构为默认架构。
· object_name:对象的名称。引用某个特定对象时,不必总是指定服务器、数据库和架构供SQL Server 2005数据库引擎标识该对象。但是,如果找不到对象,就会返回错误消息。如在2.1.5节的查询实例中,客户资料表对象命名为:Example.dbo.客户资料。它实际上就是包含了数据库名(Example)、架构名称(dbo)和对象名(客户资料),而省略了服务器名称。
★ 注意 ★
为了避免名称解析错误,建议只要指定架构范围内的对象时就指定架构名称。
2.2.4 Transact-SQL的主要组成
在Transact-SQL语言中,标准的SQL语句畅通无阻。Transact-SQL也有类似于SQL语言的分类,不过做了许多扩充。
Transact-SQL语言的分类如下:
· 数据定义语言(Data Definition Language,DDL):用来定义和管理数据库以及数据库中的各种对象的语句,这些语句包括CREATE、ALTER和DROP等。
· 数据操纵语言(Data Manipularion Language,DML):用来查询、添加、修改和删除数据库中数据的语句,这些语句包括SELECT、INSERT、UPDATE、DELETE等。
· 数据控制语言(Data Control Language,DCL):用来设置或者更改数据库用户或角色权限的语句,这些语句包括GRANT、DENY、REVOKE等。
· 系统存储过程(System Stored Procedure):系统存储过程是SQL Server系统创建的存储过程,它的目的在于能够方便地从系统表中查询信息,或者完成与更新数据库表相关的管理任务,或其他的系统管理任务。系统存储过程可以在任意一个数据库中执行。系统存储过程存放于系统数据库master中,并且名称以sp_开头。
· 一些附加的语言元素。
其中,数据定义语言、数据操纵语言和数据控制语言与上一章介绍的标准SQL的数据定义语言、数据操纵语言和数据控制语言相差不大,在后面章节将会详细展开介绍这些语言的语法结构及其使用过程。
系统存储过程在本书第11章中会有介绍。下面简单介绍一下附加的语言元素,主要包括以下几部分。
1.注释语句
注释是程序代码中不执行的文本字符串(也称为注解)。在SQL Server中,可以使用两种类型的注释字符:一种是ANSI标准的注释符“--”,它用于单行注释,一般对变量、条件子句可以采用该类注释;另一种是与C语言相同的程序注释符号,即“/* */”,可用于多行注释,对某项完整的操作建议使用该类注释。
★ 注意 ★
多行“/* */”注释不能跨越批处理,整个注释必须包含在一个批处理内。
2.批处理
批处理是从客户机传递到服务器上的一组完整的数据SQL指令。批处理的所有语句被称为一个整体,而被成组地分析、编译和执行。
简单来说,两个GO之间的SQL语句作为一个批处理。在一个批处理中可以包含一条或多条Transact-SQL语句,成为一个语句组。这样的语句组从应用程序一次性地发送到SQL Server服务器进行执行。SQL Server服务器将批处理编译成一个可执行单元,称为执行计划。
简单的批处理及注释的实例代码如下:
USE Example --选择数据库 GO /*下面即为一个批处理过程*/ SELECT * FROM dbo.客户资料 GO
3.变量
变量是一种语言中必不可少的组成部分。Transact-SQL语言中有两种形式的变量:一种是用户自己定义的局部变量;另一种是系统提供的全局变量。
(1)局部变量
局部变量是一个能够拥有特定数据类型的对象,一般出现在批处理、存储过程、触发器中,它的作用范围仅限制在程序内部。局部变量可以作为计数器来计算循环执行的次数,或者控制循环执行的次数。
其使用方式如下:
· 定义:DECLARE @变量名类型[,…],默认值为NULL。
· 赋值:SELECT @变量名=值;或者SET @变量名=值。
· 引用:SELECT @变量名;或者PRINT @变量名。
(2)全局变量
全局变量是SQL Server系统内部使用的变量,其作用范围并不仅仅局限于某一程序,而是任何程序均可以随时调用。全局变量通常存储一些SQL Server的配置设定值和统计数据。使用全局变量时,应该注意以下几点:
· 全局变量不是由用户的程序定义的,它们是在服务器级定义的。
· 用户只能使用预先定义的全局变量。
· 引用全局变量时,必须以标记符“@@”开头。
· 局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。
· 引用方式为:SELECT @@变量名。
4.运算符
运算符是一些符号,它们能够用来执行算术运算、字符串连接、赋值,以及在字段、常量和变量之间进行比较。
在SQL Server中,运算符主要有以下6大类:算术运算符、赋值运算符、位运算符、比较运算符、逻辑运算符和字符串串联运算符。
5.函数
在Transact-SQL语言中,函数被用来执行一些特殊的运算以支持SQL Server的标准命令。Transact-SQL编程语言提供了3种函数:
· 行集函数:行集函数可以在Transact-SQL语句中当作表引用。
· 聚合函数:聚合函数用于对一组值进行计算并返回一个单一的值。
· 标量函数:标量函数用于对传递给它的一个或者多个参数值进行处理和计算,并返回一个单一的值。
6.流程控制语句
流程控制语句是指那些用来控制程序执行和流程分支的命令。包括条件执行语句if…else、重复执语句while以及跳转语句GOTO和RETURN等。
★ 说明 ★
有关流程控制语句在本书的第11章有详细介绍。
其简单使用如下:
declare @x int,@y int --声明变量 select @x=3,@y=5 --为变量赋值 print @x; print @y; print @x+@y --显示 if @x>@y return --返回 else print’my god!!’
2.2.5 Transact-SQL的其他一些常用命令
除了上节介绍的内容外,Transact-SQL还包含了很多其他的一些常用命令,这些命令在通用SQL语句中是不支持的。下面对一些常用的命令作一下简单介绍。
1.BACKUP命令
BACKUP命令用于将数据库内容或其事务处理日志备份到存储介质(软盘、硬盘、磁带)上。其简单语法如下:
BACKUP DATABASE <database_name> TO <backup_device>
2.CHECKPOINT命令
CHECKPOINT命令将当前数据库的全部脏页写入磁盘。“脏页”是已输入缓存区高速缓存且已修改但尚未写入磁盘的数据页。CHECKPOINT可创建一个检查点,在该点保证全部脏页都已写入磁盘,从而在以后的恢复过程中节省时间。
其语法如下:
CHECKPOINT [ checkpoint_duration ]
参数checkpoint_duration以秒为单位指定检查点完成所需的时间。如果指定了该参数,则SQL Server 2005会在请求的持续时间内尝试执行检查点;如果省略该参数,SQL Server 2005将自动调整检查点持续时间,以便最大程度地降低对数据库应用程序性能的影响。
3.DBCC命令
Transact-SQL编程语言提供DBCC(Database Base Consistency Checker,数据库一致性检查程序)语句作为SQL Server 2005的数据库控制台命令。该命令用于验证数据库完整性、查找错误、分析系统使用情况等。
DBCC命令后必须加上子命令,系统才知道要做什么。根据实现的功能不同,DBCC语句又可分为信息语句、验证语句、维护语句和杂项语句。每种语句都包含多种命令,实现不同的功能。如DBCC CHECKALLOC命令检查目前数据库内,所有数据页的分配和使用情况。
★ 说明 ★
关于DBCC命令的详情,请参见本书的第16章。
4.EXECUTE/KILL命令
EXECUTE命令用来执行存储过程,KILL命令用于终止某一过程的执行,其具体用法请参见本书第11章的存储过程章节。
5.PRINT命令
PRINT命令向客户端返回一个用户自定义的信息,即显示一个字符串、局部变量或全局变量,如果变量值不是字符串,则必须先用数据类型转换函数CONVERT,然后再将其转换为字符串。其语法如下:
PRINT msg_str | @local_variable | string_expr
其中,msg_str为最长为255个字符的字符串;string_expr为可返回一个字符串的表达式,表达式的长度可以超过8000个字符,但超过8000的字符将不会显示。
实例1 使用PRINT命令显示信息
本实例利用PRINT命令,通过使用字符串和表达式两种参数,在客户端显示相关信息。
实例代码如下:
DECLARE @a char(20), @b char(20) --声明变量 SELECT @a='使用Print命令',@b='显示字符串' --为变量赋值 PRINT '显示信息如下:' --显示 PRINT @a+@b
运行结果如图2.11所示。
图2.11 PRINT命令运行结果
6.READTEXT命令
READTEXT命令用于从text、ntext或image列中读取text、ntext或image的值,即从指定的偏移量开始读取指定的字节数。
其语法如下:
READTEXT { table.column text_ptr offset size } [ HOLDLOCK ]
各参数含义如下:
· table.column:要对其执行读取操作的表和列的名称。必须指定表名和列名,但是,可根据需要指定数据库名称和数据库所有者名称。
· text_ptr:有效的文本指针。text_ptr必须是binary(16)。
· offset:开始读取text、image或ntext数据之前,要跳过的字节数(使用text或image数据类型时)或字符数(使用ntext数据类型时)。
· size:要读取的字节数(使用text或image数据类型时)或字符数(使用ntext数据类型时)。如果size为0,则读取4KB数据。
· HOLDLOCK:使文本值被锁定以进行读取,直到事务结束为止。其他用户可读取该值,但不能对其进行修改。
★ 注意 ★
如果数据列为汉字,则offset值应取0或其他偶数,如果用奇数,则会出现乱码。
实例2 使用READTEXT命令读取指定的字节数
本实例首先利用Management Studio为前面创建的客户资料表添加一列“备注”,其数据类型设置为TEXT,允许为空。并在天宇公司的记录的备注列中,添加数据“该公司有很好的信誉,公司规模很大。”。而后利用READTEXT命令,只读取天宇公司备注列中的前12个字。实现代码如下:
DECLARE @t_pointer varbinary (16) --声明变量 SELECT @t_pointer = TEXTPTR (备注) --为变量赋值 FROM 客户资料 WHERE 客户名称 = '天宇公司' READTEXT 客户资料.备注 @t_pointer 024 --读字符
运行结果如图2.12所示。
图2.12 READTEXT命令运行结果
★ 说明 ★
代码中用到了函数TEXTPTR,其功能为返回对应于varbinary格式的text、ntext、image列的文本指针值。
7.SET命令
Transact-SQL提供了一组SET命令,使用这些命令能设置某些选项,帮助分析Transact-SQL语句。这里介绍几个常用的SET命令。
(1)SET STATISTICS IO
该语句使SQL Server显示有关由Transact-SQL语句生成的磁盘活动量的信息。其语法如下:
SET STATISTICS IO { ON | OFF }
如果STATISTICS IO为ON,则显示统计信息;如果为OFF,则不显示统计信息。如果将此选项设置为ON,则所有后续的Transact-SQL语句将返回统计信息,直到将该选项设置为OFF为止。
实例3 使用SET STATISTICS IO命令
本实例将STATISTICS IO设置为ON,显示查询的统计信息。代码如下:
SET STATISTICS IO ON SELECT * --查询操作 FROM 客户资料 SET STATISTICS IO OFF
在Management Studio的查询分析器中运行该代码后,在“结果”窗格中将显示查询的资料结果,而在“消息”窗格中则显示查询的统计信息,如图2.13所示。
图2.13 SET STATISTICS IO命令运行结果
STATISTICS IO的其输出项及含义如表2.2所示。
表2.2 STATISTICS IO的输出项及含义
(2)SET STATISTICS TIME
该语句用于显示分析、编译和执行各语句所需的毫秒数。其语法如下:
SET STATISTICS TIME { ON | OFF }
当SET STATISTICS TIME为ON时,会显示语句的时间统计信息;为OFF时,不显示时间统计信息。
实例4 使用SET STATISTICS TIME命令
本实例将STATISTICS TIME设置为ON,显示查询的统计信息。代码如下:
SET STATISTICS TIME ON SELECT * --查询操作 FROM 客户资料 SET STATISTICS TIME OFF
运行结果如图2.14所示。
图2.14 SET STATISTICS TIME命令运行结果
(3)一些控制Transact-SQL语句执行的SET命令
常用的命令及其功能如下:
· SET SHOWPLAN_ALL:当其设置为ON时,Microsoft SQL Server不执行Transact-SQL语句。SQL Server返回有关语句执行情况的详细信息,并估计语句对资源的需求。
· SET NOEXEC:当SET NOEXEC设置为ON时,SQL Server 2005将编译每一个批处理Transact-SQL语句但并不执行它们;当SET NOEXEC设置为OFF时,所有批处理将在编译后执行。
· SET PARSONLY:当SET PARSEONLY设置为ON时,SQL Server只分析语句,检查每个Transact-SQL语句的语法并返回任何错误消息,但不编译和执行语句;当SET PARSEONLY设置为OFF时,SQL Server编译并执行语句。
当然,还有其他一些,这里不再作介绍。
(4)控制查询结果显示方式的SET命令
Transact-SQL还具有下列控制查询结果显示方式的SET命令。
· SET ROWCOUNT n:使服务器仅显示查询结果中的前n行,即在返回指定结果行后便停止查询处理。
· SET NOCOUNT ON:使服务器不报告查询返回的结果的行数。
下面以SET ROWCOUNT命令为例,介绍一下其使用方法。
实例5 使用SET ROWCOUNT命令控制查询记录数量
本实例使用SET ROWCOUNT命令设置查询处理的最大记录数目为3,而后查询客户资料表中的所有记录。代码如下:
SET ROWCOUNT 3 SELECT * --查询操作 FROM 客户资料
运行结果如图2.15所示。
图2.15 限制查询记录数的运行结果
而如果要取消设置的SET ROWCOUNT命令,只需要执行SET ROWCOUNT 0即可。对同样的查询,取消记录数限制,代码如下:
SET ROWCOUNT 0 SELECT * --查询操作 FROM 客户资料
运行结果如图2.16所示。
图2.16 取消限制的运行结果
当然,SET命令还有其他一些语句,这里不再作详细介绍。
8.SHUTDOWN命令
SHUTDOWN命令用于立即停止SQL Server。其语法可表示如下:
SHUTDOWN [WITH NOWAIT]
其中,参数WITH NOWAIT可选。在不对每个数据库执行检查点操作的情况下,关闭SQL Server。SQL Server在尝试终止全部用户进程后退出。服务器重新启动时,将针对未完成事务执行回滚操作。除非使用WITH NOWAIT选项,否则SHUTDOWN通过下列操作关闭SQL Server。
· 禁用登录(sysadmin和serveradmin固定服务器角色成员除外)。
· 等待当前正在运行的Transact-SQL语句或存储过程完成。
· 在每个数据库中插入检查点。
· 停止SQL Server的执行
还可以使用其他工具和方法停止SQL Server。每个工具或方法都在所有数据库内执行检查点。可以从数据缓存中刷新已提交的数据,然后停止服务器。
· 通过使用SQL Server配置管理器。
· 通过在命令提示符处,对默认实例运行net.start mssqlserver,或在命令提示符处针对命名实例运行net start mssql$instancename。
· 使用“控制面板”中的“服务”应用程序。
9.USE命令
USE命令将当前使用的数据库作为指定数据库。用户必须是目标数据库的用户成员,使用USE命令才能成功切换到目标数据库。
当然,Transact-SQL提供的命令远不止这些,这些只是在实例应用中经常用到的。
2.3 Transact-SQL在SQL Server中的执行
Transact-SQL不是一种标准的编程语言,它必须通过SQL Server的数据引擎来分析和运行。SQL Server是如何编译和运行Transact-SQL语句的呢?
SQL Server在处理任何Transact-SQL语句时都经过解析、编译和执行3个步骤。当一个Transact-SQL的批处理提交到SQL Server服务器时,服务器会将这个Transact-SQL批处理作为一个整体进行分析,经过优化、编译后再分步执行。
本节将简单介绍在SQL Server中,Transact-SQL语句的解析、编译和执行过程。
2.3.1 解析Transact-SQL语句
“解析”是指SQL Server命令解析模块检查Transact-SQL批处理语法的过程。其过程可简单描述如下:
· 首先,SQL Server命令解析器将检查Transact-SQL批处理的语句,是否有语法错误。
· 如果没有找到错误,命令解析器将源代码细分为多个逻辑单元,如关键字、标识符、运算符等。
· 然后,命令解析器会构建一个内部结构,通过这个内部结构生成DDL操作或DDM操作所需要的详细的步骤。如果该Transact-SQL批处理包含一个查询,那么这个内部结构为查询树(Query Tree);如果该Transact-SQL批处理是一个存储过程,那么这个内部查询为顺序树(Sequence Tree)。
SQL Server的关系引擎可表示为如图2.17所示。
图2.17 SQL Server的关系引擎部分
图2.17的左边主要是Transact-SQL的解析、编译(Compiler)和查询优化(Query Optimizer)。这是SQL Server运行Transact-SQL非常关键的部分。
图2.17的右边是执行组件,当Transact-SQL语句编译过后就会直接传给执行结构进行运行。
在中间的部分是SQL管理器(SQL Manager),它控制整个Transact-SQL批处理的解析、编译和执行。
2.3.2 编译Transact-SQL语句
这一步主要是将顺序树(Sequence Tree)生成为一个执行规划。查询优化器(Query Optimizer)主要是对Transact-SQL语句所要检索的资源进行评估,生成I/O的时间、过滤时间和其他逻辑处理的时间,然后查询优化器试图利用一个最小资源的方案。这个方案中包括执行时需要的任务列表,如安全检查、约束检查、触发器检查等。这个方案就是执行规划。
2.3.3 执行Transact-SQL语句
执行组件根据执行规划在高速缓存中运行并滞留,执行规划的不同步骤将被发送到关系引擎的不同组件进行处理,如DML管理器、DDL管理器、存储过程管理器、事务处理管理器和实用工具管理器等。处理结果将以结果集的方式被收集、合并返回调用者。
执行规划将在高速缓存中被保留一段时间,如果同一用户或其他用户发出类似请求的Transact-SQL批处理,关系数据引擎将会优先在高速缓存中寻找匹配的执行规划。如果该执行规划存在,就采用运行;如果不存在,SQL Server就会解析并编译这个Transact-SQL批处理。
2.4 小结
本章首先介绍了在SQL Server 2005中,使用Management Studio创建数据库、创建编辑表,并在查询编辑器中编辑运行Transact-SQL语言。而后,着重介绍了Transact-SQL语言的基础知识。通过本章的学习,读者应该对Transact-SQL语言和SQL标准语言的关系有更深刻的理解,并需要掌握在SQL Server 2005中,使用Management Studio编辑、运行Transact-SQL语言。