1.03k likes | 1.22k Views
第 8 章 Transact-SQL 语言编程. 通过本章的学习,掌握以下内容: 掌握批处理的基本语法结构、各种自定义函数的编写方法; 如何设计批处理 ; 如何使用流程控制语句、函数、游标等 ; 理解函数和游标的灵活性,掌握通过批处理将两者结合的方法。. 第 8 章 Transact-SQL 语言编程. 8.1 批处理、脚本和注释 8.2 常 量 和 变 量 8.3 系 统 函 数 8.4 流 程 控 制 语 句 8.5 用 户 自 定 义 函 数 8.6 游 标 及 其 应 用.
E N D
第 8 章 Transact-SQL语言编程 • 通过本章的学习,掌握以下内容: • 掌握批处理的基本语法结构、各种自定义函数的编写方法; • 如何设计批处理; • 如何使用流程控制语句、函数、游标等; • 理解函数和游标的灵活性,掌握通过批处理将两者结合的方法。
第 8 章 Transact-SQL语言编程 • 8.1 批处理、脚本和注释 • 8.2 常 量 和 变 量 • 8.3 系 统 函 数 • 8.4 流 程 控 制 语 句 • 8.5 用 户 自 定 义 函 数 • 8.6 游 标 及 其 应 用
SQL 语言是一种功能单一化的查询语言,而本章所讲的Transact SQL 语言则是一种编程语言,与SQL查询语言相比,它多了许多编程的成分,比如常量和变量,系统函数和用户自定义函数,流程控制语句,While、For、Case语句等。 T-SQL语言的基本成分是语句,由一个或多个语句可以构成一个批处理,由一个或多个批处理可以构成一个查询脚本(以sql作为文件扩展名)并保存到磁盘文件中,供以后需要时使用。
8.1 批处理、脚本和注释 • 批处理就是一个或多个Transact-SQL语句的集合,用户或应用程序一次将它发送给SQL Server,由SQL Server编译成一个执行单元,此单元称为执行计划,执行计划中的语句每次执行一条。
一些SQL语句不能放在同一个批处理中执行,它们需要遵循下述规则:一些SQL语句不能放在同一个批处理中执行,它们需要遵循下述规则: 1. 大多数CREATE 命令要在单个批处理中执行,但CREATE DATABASE、CREATE TABLE、CREATE INDEX 除外。 2. 调用存储过程时,如果它不是批处理中第一个语句,则在它前面必须加上EXECUTE。 3. 不能把规则和默认值绑定到用户定义的数据类型上后,在同一个批处理中使用它们。 4. 不能在给表字段定义了一个CHECK约束后,在同一个批处理中使用该约束。 5. 不能在修改表的字段名后,在同一个批处理中引用该新字段名。
8.1.1 批处理 • 建立批处理如同编写SQL语句,区别在于它是多条语句同时执行的,用GO语句作为一个批处理的结束。 • 例8-1:利用查询分析器,查询客户购买商品的信息,新建客户订单视图。
create view 客户订单视图 as select a.编号,a.姓名,a.电话,b.货品编码,b.订货日期 from 客户信息 a inner join 订单信息 b on a.编号=b.客户编号 go select * from 客户订单视图 Go 由于CREATE VIEW 建立视图语句不能和其他使用语句放在同一个批处理中,所以需要GO命令将CREATE VIEW语句与其下的语句SELECT分成两个批处理。否则SQL Server将报错。
客户信息 订单信息
8.1.2 脚本 • 数据库应用过程中,经常需要把编写好的SQL语句(例如创建数据库对象、调试通过的SQL语句集合)保存起来,以便下一次执行同样(或类似)操作时,调用这些语句集合。这样可以省去重新 编写调试SQL语句的麻烦,提高工作效率。这些用于执行某项操作的T-SQL语句集合称为脚本。T-SQL脚本存储为文件,带有 sql 扩展名。 • 使用脚本文件对重复操作或几台计算机之间交换SQL语句是非常有用的。
8.1.2 脚本 • 脚本是批处理的存在方式,将一个或多个批处理组织到一起就是一个脚本 。例如我们在查询分析器中执行的各个实例都可以称为一个脚本。 • 生成脚本有两种方法: • 1.在查询分析器中保存脚本; • 2. 在企业管理器中创建数据库对象脚本。 • 脚本可以在查询分析器中执行,也可以在ISQL或OSQL实用程序中执行。查询分析器是编辑、调试和使用脚本的最好环境。
8.1.3 注释 • 脚本文件除了含有T-SQL语句外,还包含有对SQL语句进行说明的注释。注释是不能执行的文字字符串,或暂时禁用的部分语句。 • 为程序加注释不仅能使程序易懂,更有助于日后的管理和维护。 • 注释通常用于记录程序名、作者姓名和主要的程序更改日期,也用于描述复杂的计算或解释编程方法等。 • SQL Server支持两种形式的注释语句:行内注释与快注释。
1.行内注释 • 行内注释的语法格式为: • – –注释文本 • 2.块注释 • 块注释的语法格式为: • /*注释文本*/ • 或: • /* • 注释文本 • */
8.2 常 量 和 变 量 • 常量和变量是程序设计中不可缺少的元素。变量又分为局部变量和全局变量,局部变量是一个能够保存特定数据类型实例的对象,是程序中各种类型数据的临时存储单元,用在批处理内SQL语句之间传递数据。局部变量的作用域,只在声明它的批处理内,一旦批处理结束,局部变量自动消失。全局变量是系统给定的特殊变量。
8.2.1 常量 • Transact-SQL的常量主要有以下几种。 • 1. 字符串常量 • 2. 数值常量 • 3. 日期常量
8.2.1 常量 • 1. 字符串常量 • 字符串常量包含在单引号之内,由字母数字(如a-z,A-Z,0-9)及特殊符号(!,@,#)组成。例如:’SQL SERVER 2000’.如果字符串常量中包含有一个单引号,可以用两个单引号表示这个字符串常量内的单引号,如 ‘Tom’s birthday’,即可以表示为’Tom’’s birthday’
8.2.1 常量 • 2. 数值常量 • Bit常量:用0或1表示,如果是一个大于1的数,它将被转化为1。 • Integer常量:整数常量,不包含小数点。如1968。 • Decimal常量:可以包含小数点的数值常量。例如:123.456。 • Float常量和real常量:使用科学计数法表示:101.5E6、54.8E-11等。 • Money常量:货币类型,可以包含小数点。 • 正数前加“+”或不加,负数前加“-”。例如-123.45,$-32.5等。
8.2.1 常量 • 3.日期常量 • 使用特定格的字符日期表示,并用单引号括起来。如:‘2007/11/27 18:49:07’.
8.2.2 局部变量 • 局部变量是用户在程序中定义的变量,一次只能保存一个值,它仅在定义的批处理范围内有效。局部变量可以临时存储数值。局部变量名总是以@符号开始,最长为128个字符。 • 使用DECLARE语句声明局部变量,定义局部变量的名字、数据类型,有些还需要确定变量的长度。
局部变量的初值为NULL,可以使用SELECT或SET语句对局部变量进行赋值。SET语句一次只能给一个局部变量赋值,而SELECT语句可以同时给一个或多个变量赋值。局部变量的初值为NULL,可以使用SELECT或SET语句对局部变量进行赋值。SET语句一次只能给一个局部变量赋值,而SELECT语句可以同时给一个或多个变量赋值。 例8-2:定义两个局部变量,用他们来显示当前的日期。 本例中给出了两种显示方式:PRINT显示在“消息”框,而SELECT显示在“网格”框。 declare @todayDate char(10),@dispStr varchar(20) set @todayDate=getdate() set @dispStr='今天的日期为:' print @dispstr+@todaydate select @dispstr+@todaydate
例题:通过SELECT语句来给多个变量赋值。 declare @name varchar(50),@lianxiren varchar(10),@address varchar(50) declare @msgstr varchar(80) --变量赋值 select @name=名称,@lianxiren=联系人,@address=地址 from 供应商信息 set @msgstr='供应商名:'+@name+' 联系人:'+@lianxiren+' 地址:'+@address --显示信息 select @msgstr Go
当返回的行数大于1时,仅最后一行的数据赋给变量。当返回的行数大于1时,仅最后一行的数据赋给变量。 Select 名称,联系人,地址 from 供应商信息 返回6条记录,仅最后一行赋给了变量值。如果要每一行一行地进行处理,则需要用到游标或循环的概念。 例8-3:利用例8-1给出的“客户订单视图”和“货品视图”,将客户编号为2的客户订货信息显示一条消息,该消息给出客户姓名、电话、订货日期、货品名称、供应商。
declare @uName varchar(10),@uTel varchar(10),@uOrder varchar(10) declare @goodN varchar(30),@company varchar(30) declare @MsgStr varchar(80) select @uName=a.姓名,@uTel=a.电话,@uOrder=a.订货日期, @goodN=b.货品名称,@Company=b.供应商名称 from 客户订单视图 a inner join 货品视图 b on a.货品编码=b.编码 and a.编号=2 set @MsgStr='客户'+@uName+'联系电话'+@uTel+'于'+@uOrder+'订购了'+@company+'的' +@goodN+'.' print @MsgStr go
客户订单视图 货品视图
两视图连接的结果: 最终显示的信息:
例8-4:局部变量引用出错的演示。 局部变量的作用域,只能在声明它的批处理内部。一旦批处理消失,局部变量也将自动消失。 Declare @dispstr varchar(20) Set @dispstr='这是一个局部变量引用出错的演示' Go --批处理在这里结束,局部变量被清除。 Print @dispstr Go
8.2.3 全局变量 • 全局变量是SQL Server系统提供并赋值的变量。用户不能定义全局变量,也不能用SET语句来修改全局变量。通常是将全局变量的值赋给局部变量,以便保存和处理。事实上,在SQL Server中,全局变量是一组特定的函数,它们的名称是以@@开头,而且不需要任何参数,在调用时无需在函数名后面加上一对圆括号,这些函数也称为无参数函数。 • 大部分的全局变量记录了SQL Server服务器的当前状态信息。
例8-5:利用全局变量查看SQL Server的版本、当前使用的语言、服务器及服务器名称。 print '所用SQL sever的版本信息' print @@version print '' print '服务器名称为: '+@@servername print '所用的语言为: '+@@language print '所用的服务为: '+@@servicename go
8.3 系 统 函 数 • 函数对于任何程序设计语言都是非常关键的组成部分。SQL Server提供的函数分为以下几类:集合函数、配置函数、游标函数、日期函数、数学函数、元数据函数、行集函数、安全函数、字符串函数、系统函数、文本与图像函数。
一些函数提供了取得信息的快捷方法。函数有值返回,值的类型取决于所使用的函数。一般来说,允许使用变量、字段或表达式的地方都可以使用函数。 一些函数提供了取得信息的快捷方法。函数有值返回,值的类型取决于所使用的函数。一般来说,允许使用变量、字段或表达式的地方都可以使用函数。 • 有些函数以前介绍过,例如集合函数:(SUM()、AVG()、COUNT())。
8.3.1 字符串函数 Space(整型表达式):返回N个空格组成的字符串,N为整型表达式。 Ltrim(字符表达式):去掉字符表达式的前导空格。 Charindex(字符表达式1,字符表达式2,[开始位置]):返回字符表达式1在字符表达式2的开始位置,可以从所给出的“开始位置”进行查找,如果没指定开始位置,或者指定为负数和零,则默认从字符表达式2的开始位置进行查找。 Replicate(字符表达式,整型表达式):将字符表达式重复多次,整数表达式给出重复的次数。
例8-6:给出“计算机”在“深圳现代计算机股份有限公司”中的位置。例8-6:给出“计算机”在“深圳现代计算机股份有限公司”中的位置。 • select charindex('计算机','深圳现代计算机公司') 开始位置 • declare @StrTarget varchar(30) • set @StrTarget='深圳现代计算机公司' • select CHARINDEX(‘计算机', @StrTarget) 开始1位置, CHARINDEX ('计算机','深圳现代计算机公司') 开始2位置 • go
例8-7:REPLICATE和SPACE函数的练习。 • SELECT REPLICATE('*',10),SPACE(10), REPLICATE('大家好!',2),space(10), REPLICATE('*',10) • PRINT REPLICATE('*',10)+SPACE(10)+REPLICATE('大家好!',2)+SPACE(10)+REPLICATE('*',10) • GO
8.3.2 日期函数 • 日期函数用来显示日期和时间的信息。它们处理datetime和smalldatetime的值,并对其进行数学运算。 • 表8-2列出了所有日期函数。
例8-8:给出服务器当前的系统日期和时间,给出系统当前的月份和月份名字。例8-8:给出服务器当前的系统日期和时间,给出系统当前的月份和月份名字。 • select getdate() 当前日期和时间, • datepart(year,getdate()) 年, • datename(year,getdate()) 年名, • datepart(month,getdate()) 月份, • datename(month,getdate()) 月份名, • datepart(day,getdate()) 日 • print '当前日期'+datename(year,getdate())+'年'+datename(month,getdate())+'月'+ • datename(day,getdate())+'日' • go
例8-9:Mary的生日为1980/8/13,请使用日期函数计算Mary的年龄和天数。例8-9:Mary的生日为1980/8/13,请使用日期函数计算Mary的年龄和天数。 • select年龄=datediff(year,'1980/8/13',getdate()), • 天=datediff(day,'1980/8/13',getdate()) • go
8.3.3 系统综合函数 • 在这里重点介绍两个数据类型转换函数CAST和CONVERT,在SQL SERVER中,有些数据类型之间会自动进行转换,有些类型之间必须显式地进行转换,而有些类型是不允许转换的。 • 1.CAST函数 • 语法格式为: • CAST(表达式 AS 数据类型):将表达式显式转化为另一种数据类型。
例8-10:Mary的生日为1980/8/13,请使用日期函数计算Mary的年龄和天数,并以消息的形式输出。例8-10:Mary的生日为1980/8/13,请使用日期函数计算Mary的年龄和天数,并以消息的形式输出。 由datediff得到的年龄和天数均为整数,显示时需要进行类型转换。整数可以出现在SELECT语句中,但不能出现在PRINT语句中,后者只输出字符串。
Print 'Mary的年龄是'+cast(datediff(year,'1980/8/13',getdate()) as char(2))+'岁,核'+cast(datediff(day,'1980/8/13',getdate())as char(5))+'天' Go select 'Mary的年龄是'=datediff(year,'1980/8/13',getdate()) ,datediff(day,'1980/8/13',getdate()) Go
2.CONVERT函数 如果希望指定类型转换后数据的样式,则应使用CONVERT函数进行数据类型转换。 语法格式为: CONVERT(数据类型[(长度)], 表达式[, style]) 其中的表达式是任何有效的SQL Server表达式,数据类型只能是系统数据类型,不能是用户自定义的数据类型。
设置日期输入格式用 SET DATEFORMAT。它用于设置输入DATETIME或SMALLDATATIME 数据的日期部分的顺序。 格式为: SET FORMAT {格式|@格式变量} 格式的有效参数包括mdy(月日年)、dmy(日月年)、ymd(年月日)、ydm(年日月)、myd(月年日)、dym(日年月)。美国英语默认值是mdy。
例8-11:演示SET DATEFORMAT 和CONVERT函数的使用方法。 set dateformat mdy declare @dt datetime set @dt='03.03.03 03:03:03 PM' select 默认格式=@dt, 仅有日期=convert(varchar(30),@dt,102), 仅有时间=convert(varchar(30),@dt,108), 仅有日期=convert(varchar(30),@dt,111), 日期和时间=convert(varchar(30),@dt,120)
declare @rl REAL set @rl=2568 select 实数6位=convert(varchar(40),@rl,0), 实数8位=convert(varchar(40),@rl,1), 实数16位=convert(varchar(40),@rl,2) Declare @my money set @my=9635225.36 select 货币默认=convert(varchar(25),@my,0), 货币1=convert(varchar(25),@my,1), 货币2=convert(varchar(25),@my,2)
8.3.4 数学函数(见表8-6) 常用的有: CEILING(数值表达式):返回大于或等于数值表达式的最小整数。 FLOOR(数值表达式):返回小于或等于数值表达式的最大整数。是CEILING的反函数。 RADIANS(数值表达式):将度数转化为弧度。 RAND([整形表达式]):返回一个1到0之间的随机十进制数。
例8-12:将180度转化为弧度,并用CEILING和FLOOR函数给出大于它的最小整数和小于它的最大整数。例8-12:将180度转化为弧度,并用CEILING和FLOOR函数给出大于它的最小整数和小于它的最大整数。 • select • 弧度=radians(180.), • 大于的最小整数=ceiling(radians(180.)), • 小于的最大整数=floor(radians(180.))
8.3.7 行集函数(见表8-9) • 例8-15:使用OPENDATASOURCE函数访问Marketing数据库的“客户信息”表的数据。 • select * • from opendatasource('SQLoledb', • 'data source=WJW-PC;user id=sa').marketing.dbo.客户信息 • go
8.3.9 配置函数(见8-11) 配置函数给出系统当前的参数,它是全局变量的一部分。 @@language:返回当前使用语言的名称 @@max_connections :返回允许用户同时连接的最大数。 @@servername :返回运行SQL Server 数据库服务器的名称。 @@version :返回SQL Server当前安装的日期、版本和处理其类型。 例8-16:给出SQL Server 的最大连接数。 Select @@max_connections Go