数据技术基础第7章Transact-SQLSQL语言简介SQL语言是面向集合的描述性语言,是非过程性的(即大多数语句都是独立执行的,与上下文无关)。将SQL语言嵌入到某种高级语言中使用,利用高级语言的过程性结构来弥补SQL语言实现复杂应用方面的不足。以这种方式使用的SQL语言称为嵌入式SQL(EmbeddedSQL)。嵌入SQL的高级语言称为主语言或宿主语言。第7章Transact-SQL7.1学习目标7.2Transact-SQL的基本概念7.3游标7.4存储过程7.5触发器7.6小结7.1学习目标学完本章后,读者应具备以下能力:理解常量、变量的定义方法。理解批处理,掌握各种控制语句的使用方法。了解常用的函数。理解游标的概念,基本掌握使用游标查询数据的过程,了解CurrentOf的作用和使用方法。掌握存储过程的概念和用途。理解触发器的概念和用途。7.2Transact-SQL的基本概念7.2.1常量7.2.2变量7.2.3运算符7.2.4常用函数7.2.5流程控制语句7.2.1常量常量是在程序运行中值不发生变化的量常量分为字符串常量、整型常量、实型常量、货币常量和日期时间常量。7.2.1常量(续)字符串常量字符串常量分为ASCII字符串常量和Unicode字符串常量。ASCII字符串常量是用单引号括起来、由ASCII字符构成的字符串;Unicode字符串常量前面有一个N,代表国际语言。每个ASCII字符由一个字节存储。每个Unicode字符需要两个字节的存储空间。[例子]ASCII字符串常量'Haveaniceday!''马翔''2563'如果单引号是字符串的一部分,则需要用两个单引号表示。'Jone''shome'Unicode字符串常量N'Haveaniceday!'N'马翔'7.2.1常量(续)整型常量整型常量由数字0~9以及+/-号组成的有意义的串。如:123、-9811、+89实型常量实型常量有定点和浮点两种表示形式。定点实型常量:由数字0~9、小数点和正负号组成有意义的串。如:1.0、3467.584浮点实型常量:由数字0~9、小数点、正负号和字母E组成有意义的串。如:0.68E+3、1E10、-23E27.2.1常量(续)货币常量货币常量是以$符号为前缀的整型或实型常量,用来表示货币值,精度为4位小数,如$100、-$52、$16.37。日期时间常量日期常量是用单引号括起来的有效的日期和时间组成的字符串。常见的日期格式:'September1,2007'、'2007年9月1号'、'2007-09-01'、'09/01/2007'、'20070901'常见的时间格式:'14:12:00'、'02:12PM'7.2T-SQL的基本概念7.2.1常量7.2.2变量7.2.3运算符7.2.4常用函数7.2.5流程控制语句7.2.2变量变量就是在程序运行中其值会发生变化的量。变量可用于存放输入的值以及保存计算结果等。SQLServer有两类变量。全局变量局部变量7.2.2变量(续)全局变量全局变量是SQLServer管理的变量。用户不能建立全局变量,可以查看全局变量的值,但不能改变全局变量的值。全局变量分为两类:•一类反映SQLServer系统的全局变量。•另一类反映与一个连接有关的全局变量。全局变量的特征是变量名前2个符号必须是@@。7.2.2变量(续)SQLServer提供了大约30多个全局变量,常用的全局变量有:@@SERVERNAME返回运行Microsoft®SQLServer的本地服务器名称。@@SERVICENAME返回MicrosoftSQLServer正在其下运行的注册表键名。若当前实例为默认实例,则@@SERVICENAME返回MSSQLServer;若当前实例是命名实例,则返回实例名。@@VERSION返回MicrosoftSQLServer当前安装的日期、版本和处理器类型。@@CONNECTIONS返回自上次启动MicrosoftSQLServer以来连接或试图连接的次数。@@MAX_CONNECTIONS返回MicrosoftSQLServer所允许的同时连接的最大用户数。返回的数不必为当前配置的数值。@@DATEFIRST返回SETDATEFIRST参数的当前值,SETDATEFIRST参数指明所规定的每周第一天:1对应星期一,2对应星期二,依次类推,用7对应星期日。7.2.2变量(续)@@TEXTSIZE返回SET语句TEXTSIZE选项的当前值,它指定SELECT语句返回的text或image数据的最大长度,以字节为单位。@@REMSERVER当远程MicrosoftSQLServer数据库服务器在登录日志中出现时,返回它的名称。@@MAX_PRECISION返回decimal和numeric数据类型所用的精度级别,即该服务器中当前设置的精度。@@TIMETICKS返回一刻度的微秒数。@@OPTIONS返回当前SET选项的信息。@@CPU_BUSY返回自上次启动MicrosoftSQLServer以来CPU的工作时间,单位为毫秒。7.2.2变量(续)@@IDLE返回MicrosoftSQLServer自上次启动后闲置的时间,单位为毫秒。@@IO_BUSY返回MicrosoftSQLServer自上次启动后用于执行输入和输出操作的时间,单位为毫秒。@@TOTAL_ERRORS返回MicrosoftSQLServer自上次启动后,所遇到的磁盘读/写错误数。@@TOTAL_READ返回MicrosoftSQLServer自上次启动后读取磁盘(不是读取高速缓存)的次数。@@TOTAL_WRITE返回MicrosoftSQLServer自上次启动后写入磁盘的次数。@@PACK_RECEIVED返回MicrosoftSQLServer自上次启动后从网络上读取的输入数据包数目。7.2.2变量(续)@@PACK_SENT返回MicrosoftSQLServer自上次启动后写到网络上的输出数据包数目。@@PACKET_ERRORS返回自SQLServer上次启动后,在MicrosoftSQLServer连接上发生的网络数据包错误数。@@LANGID返回当前所使用语言的本地语言标识符(ID)。@@LANGUAGE返回当前使用的语言名。@@SPID返回当前用户进程的服务器进程标识符(ID)。@@TRANCOUNT返回当前连接的活动事务数。@@ROWCOUNT返回受上一语句影响的行数。7.2.2变量(续)@@PROCID返回当前过程的存储过程标识符(ID)。@@NESTLEVEL返回当前存储过程执行的嵌套层次(初始值为0)。注意:每当一个存储过程调用另一个存储过程时,嵌套层次即进行递增。超过最大层数32时,事务即被终止。@@IDENTITY返回最后插入的标识值。@@DBTS为当前数据库返回当前timestamp数据类型的值。这一timestamp值保证在数据库中是唯一的。@@LOCK_TIMEOUT返回当前会话的当前锁超时设置,单位为毫秒。SETLOCK_TIMEOUT允许应用程序设置语句等待阻塞资源的最长时间。当一条语句已等待超过LOCK_TIMEOUT所设置的时间,则被锁住的语句将自动取消,并给应用程序返回一条错误信息。7.2.2变量(续)@@FETCH_STATUS返回被FETCH语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。0FETCH语句成功。-1表示FETCH语句失败或此行不在结果集中。-2表示被提取的行不存在。@@CURSOR_ROWS返回连接上最后打开的游标中当前存在的合格行的数量。为提高性能,MicrosoftSQLServer可以异步填充大键集和静态游标。可调用@@CURSOR_ROWS,以确定当它被调用时符合游标的行的数目被进行了检索。@@ERROR返回最后执行的Transact-SQL语句的错误代码。当MicrosoftSQLServer完成Transact-SQL语句的执行时,如果语句执行成功,则@@ERROR设置为0。若出现一个错误,则返回一条错误消息。@@ERROR返回此错误信息代码,直到另一条Transact-SQL语句被执行。可以在sysmessages系统表中查看与@@ERROR错误代码相关的文本信息。由于@@ERROR在每一条语句执行后被清除并且重置,应在语句执行后立即检查它,或将其保存到一个局部变量中以备事后查看。7.2.2变量(续)局部变量局部变量是在一定范围内有意义的变量,由用户建立和使用。局部变量的作用范围一般为批处理、存储过程、触发器。局部变量的命名要求第一个字符必须是@,由字母、数字、下画线等字符组成,不能与SQLServer的保留字、全局变量、存储过程、表等其他数据库对象重名。局部变量要用DECLARE语句声明:DECLARE@variabledataType例如:声明一个字符型变量,名字为studentName。DECLARE@studentNamevarchar(12)可以用SET或SELECT语句给局部变量赋值。SET@studentName='马翔'SELECT@studentName='马翔'局部变量可以出现在SQL语句中:SELECT*FROMStudentWHERESname=@studentName7.2T-SQL的基本概念7.2.1常量7.2.2变量7.2.3运算符7.2.4常用函数7.2.5流程控制语句7.2.3运算符算术运算符算术运算符用于对两个数字型的量进行数学运算;算术运算符有:+(加)、-(减)、*(乘)、/(除)、%(取余);+和-还可以作为一元运算符,也可以对datatime和smalldatatime类型的数据进行运算。7.2.2运算符(续)比较运算符比较运算符用于比较两个表达式的值之间的关系。结果为布尔值:TRUE(真)、FALSE(假)、UNKNOWN(未知)。比较运算符有:=(等于)、(小于)、=(小于等于)、(大于)、=(大于等于)、(不等于,另外一个写法是!=)、!(不大于)、!(不小于)。7.2.3运算符(续)运算符含义可操作的数据类型+(加)加法或正号bit,tinyint,smallint,int,bigint,real,float,decimal,numeric,datetime,smalldatetime-(减)减法或负号同上*(乘)乘法同上,但不包括datetime,smalldatetime/(除)除法同*(乘法运算符)%(模)返回余数tinyint,smallint,int,bigint,如:22%5=2表7.1算术元算符7.2.3运算符(续)逻辑运算符逻辑运算符用于对表达式进行测试,返回布尔值。逻辑运算符运算符有:AND、OR、NOT、ALL、ANY、SOME、BETWEEN、EXISTS、IN、LIKE,这些运算符的含义同前面介绍的SQL逻辑运算符。7.2.3运算符(续)运算符含义AND若两个布尔表达式都为TRUE,则为TRUEOR若两个布尔表达式中的一个为TRUE,则为TRUENOT取操作数的相反值ALL若一系列的比较都为TRUE,则为TRUEANY若一系列的比较中任何一个为TRUE,则为TRUEBETWEEN若操作数在某个范围之内,则为TRUEEXISTS若子查询的结果包含了一些元组,则为TRUEIN若操作数等于表达式列表中的一个,则为TRUELIKE若操作数与一种模式相匹配,则为TRUESOME若在一系列比较中,有些为TRUE,则为TRUE表7.2逻辑运算符连接运算符字符串连接运算符将几个字符串串联起来。字符串连接运算符为+。例如:SET@studentName='马'+'翔‘位运算符位运算符可以对两个表达式进行位操作,这两个表达式可以是十进制、二进制整型数据,十进制