1 / 103

第 8 章 Transact-SQL 语言编程

第 8 章 Transact-SQL 语言编程. 通过本章的学习,掌握以下内容: 掌握批处理的基本语法结构、各种自定义函数的编写方法; 如何设计批处理 ; 如何使用流程控制语句、函数、游标等 ; 理解函数和游标的灵活性,掌握通过批处理将两者结合的方法。. 第 8 章 Transact-SQL 语言编程. 8.1 批处理、脚本和注释 8.2 常 量 和 变 量 8.3 系 统 函 数 8.4 流 程 控 制 语 句 8.5 用 户 自 定 义 函 数 8.6 游 标 及 其 应 用.

Download Presentation

第 8 章 Transact-SQL 语言编程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第 8 章 Transact-SQL语言编程 • 通过本章的学习,掌握以下内容: • 掌握批处理的基本语法结构、各种自定义函数的编写方法; • 如何设计批处理; • 如何使用流程控制语句、函数、游标等; • 理解函数和游标的灵活性,掌握通过批处理将两者结合的方法。

  2. 第 8 章 Transact-SQL语言编程 • 8.1 批处理、脚本和注释 • 8.2 常 量 和 变 量 • 8.3 系 统 函 数 • 8.4 流 程 控 制 语 句 • 8.5 用 户 自 定 义 函 数 • 8.6 游 标 及 其 应 用

  3. SQL 语言是一种功能单一化的查询语言,而本章所讲的Transact SQL 语言则是一种编程语言,与SQL查询语言相比,它多了许多编程的成分,比如常量和变量,系统函数和用户自定义函数,流程控制语句,While、For、Case语句等。 T-SQL语言的基本成分是语句,由一个或多个语句可以构成一个批处理,由一个或多个批处理可以构成一个查询脚本(以sql作为文件扩展名)并保存到磁盘文件中,供以后需要时使用。

  4. 8.1 批处理、脚本和注释 • 批处理就是一个或多个Transact-SQL语句的集合,用户或应用程序一次将它发送给SQL Server,由SQL Server编译成一个执行单元,此单元称为执行计划,执行计划中的语句每次执行一条。

  5. 一些SQL语句不能放在同一个批处理中执行,它们需要遵循下述规则:一些SQL语句不能放在同一个批处理中执行,它们需要遵循下述规则: 1. 大多数CREATE 命令要在单个批处理中执行,但CREATE DATABASE、CREATE TABLE、CREATE INDEX 除外。 2. 调用存储过程时,如果它不是批处理中第一个语句,则在它前面必须加上EXECUTE。 3. 不能把规则和默认值绑定到用户定义的数据类型上后,在同一个批处理中使用它们。 4. 不能在给表字段定义了一个CHECK约束后,在同一个批处理中使用该约束。 5. 不能在修改表的字段名后,在同一个批处理中引用该新字段名。

  6. 8.1.1 批处理 • 建立批处理如同编写SQL语句,区别在于它是多条语句同时执行的,用GO语句作为一个批处理的结束。 • 例8-1:利用查询分析器,查询客户购买商品的信息,新建客户订单视图。

  7. 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. 客户信息 订单信息

  9. 客户订单视图

  10. 8.1.2 脚本 • 数据库应用过程中,经常需要把编写好的SQL语句(例如创建数据库对象、调试通过的SQL语句集合)保存起来,以便下一次执行同样(或类似)操作时,调用这些语句集合。这样可以省去重新 编写调试SQL语句的麻烦,提高工作效率。这些用于执行某项操作的T-SQL语句集合称为脚本。T-SQL脚本存储为文件,带有 sql 扩展名。 • 使用脚本文件对重复操作或几台计算机之间交换SQL语句是非常有用的。

  11. 8.1.2 脚本 • 脚本是批处理的存在方式,将一个或多个批处理组织到一起就是一个脚本 。例如我们在查询分析器中执行的各个实例都可以称为一个脚本。 • 生成脚本有两种方法: • 1.在查询分析器中保存脚本; • 2. 在企业管理器中创建数据库对象脚本。 • 脚本可以在查询分析器中执行,也可以在ISQL或OSQL实用程序中执行。查询分析器是编辑、调试和使用脚本的最好环境。

  12. 8.1.3 注释 • 脚本文件除了含有T-SQL语句外,还包含有对SQL语句进行说明的注释。注释是不能执行的文字字符串,或暂时禁用的部分语句。 • 为程序加注释不仅能使程序易懂,更有助于日后的管理和维护。 • 注释通常用于记录程序名、作者姓名和主要的程序更改日期,也用于描述复杂的计算或解释编程方法等。 • SQL Server支持两种形式的注释语句:行内注释与快注释。

  13. 1.行内注释 • 行内注释的语法格式为: • – –注释文本 • 2.块注释 • 块注释的语法格式为: • /*注释文本*/ • 或: • /* • 注释文本 • */

  14. 8.2 常 量 和 变 量 • 常量和变量是程序设计中不可缺少的元素。变量又分为局部变量和全局变量,局部变量是一个能够保存特定数据类型实例的对象,是程序中各种类型数据的临时存储单元,用在批处理内SQL语句之间传递数据。局部变量的作用域,只在声明它的批处理内,一旦批处理结束,局部变量自动消失。全局变量是系统给定的特殊变量。

  15. 8.2.1 常量 • Transact-SQL的常量主要有以下几种。 • 1. 字符串常量 • 2. 数值常量 • 3. 日期常量

  16. 8.2.1 常量 • 1. 字符串常量 • 字符串常量包含在单引号之内,由字母数字(如a-z,A-Z,0-9)及特殊符号(!,@,#)组成。例如:’SQL SERVER 2000’.如果字符串常量中包含有一个单引号,可以用两个单引号表示这个字符串常量内的单引号,如 ‘Tom’s birthday’,即可以表示为’Tom’’s birthday’

  17. 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等。

  18. 8.2.1 常量 • 3.日期常量 • 使用特定格的字符日期表示,并用单引号括起来。如:‘2007/11/27 18:49:07’.

  19. 8.2.2 局部变量 • 局部变量是用户在程序中定义的变量,一次只能保存一个值,它仅在定义的批处理范围内有效。局部变量可以临时存储数值。局部变量名总是以@符号开始,最长为128个字符。 • 使用DECLARE语句声明局部变量,定义局部变量的名字、数据类型,有些还需要确定变量的长度。

  20. 局部变量的初值为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

  21. 例题:通过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

  22. 当返回的行数大于1时,仅最后一行的数据赋给变量。当返回的行数大于1时,仅最后一行的数据赋给变量。 Select 名称,联系人,地址 from 供应商信息 返回6条记录,仅最后一行赋给了变量值。如果要每一行一行地进行处理,则需要用到游标或循环的概念。 例8-3:利用例8-1给出的“客户订单视图”和“货品视图”,将客户编号为2的客户订货信息显示一条消息,该消息给出客户姓名、电话、订货日期、货品名称、供应商。

  23. 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

  24. 客户订单视图 货品视图

  25. 两视图连接的结果: 最终显示的信息:

  26. 例8-4:局部变量引用出错的演示。 局部变量的作用域,只能在声明它的批处理内部。一旦批处理消失,局部变量也将自动消失。 Declare @dispstr varchar(20) Set @dispstr='这是一个局部变量引用出错的演示' Go --批处理在这里结束,局部变量被清除。 Print @dispstr Go

  27. 8.2.3 全局变量 • 全局变量是SQL Server系统提供并赋值的变量。用户不能定义全局变量,也不能用SET语句来修改全局变量。通常是将全局变量的值赋给局部变量,以便保存和处理。事实上,在SQL Server中,全局变量是一组特定的函数,它们的名称是以@@开头,而且不需要任何参数,在调用时无需在函数名后面加上一对圆括号,这些函数也称为无参数函数。 • 大部分的全局变量记录了SQL Server服务器的当前状态信息。

  28. 例8-5:利用全局变量查看SQL Server的版本、当前使用的语言、服务器及服务器名称。 print '所用SQL sever的版本信息' print @@version print '' print '服务器名称为: '+@@servername print '所用的语言为: '+@@language print '所用的服务为: '+@@servicename go

  29. 8.3 系 统 函 数 • 函数对于任何程序设计语言都是非常关键的组成部分。SQL Server提供的函数分为以下几类:集合函数、配置函数、游标函数、日期函数、数学函数、元数据函数、行集函数、安全函数、字符串函数、系统函数、文本与图像函数。

  30. 一些函数提供了取得信息的快捷方法。函数有值返回,值的类型取决于所使用的函数。一般来说,允许使用变量、字段或表达式的地方都可以使用函数。 一些函数提供了取得信息的快捷方法。函数有值返回,值的类型取决于所使用的函数。一般来说,允许使用变量、字段或表达式的地方都可以使用函数。 • 有些函数以前介绍过,例如集合函数:(SUM()、AVG()、COUNT())。

  31. 8.3.1 字符串函数 Space(整型表达式):返回N个空格组成的字符串,N为整型表达式。 Ltrim(字符表达式):去掉字符表达式的前导空格。 Charindex(字符表达式1,字符表达式2,[开始位置]):返回字符表达式1在字符表达式2的开始位置,可以从所给出的“开始位置”进行查找,如果没指定开始位置,或者指定为负数和零,则默认从字符表达式2的开始位置进行查找。 Replicate(字符表达式,整型表达式):将字符表达式重复多次,整数表达式给出重复的次数。

  32. 例8-6:给出“计算机”在“深圳现代计算机股份有限公司”中的位置。例8-6:给出“计算机”在“深圳现代计算机股份有限公司”中的位置。 • select charindex('计算机','深圳现代计算机公司') 开始位置 • declare @StrTarget varchar(30) • set @StrTarget='深圳现代计算机公司' • select CHARINDEX(‘计算机', @StrTarget) 开始1位置, CHARINDEX ('计算机','深圳现代计算机公司') 开始2位置 • go

  33. 例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

  34. 8.3.2 日期函数 • 日期函数用来显示日期和时间的信息。它们处理datetime和smalldatetime的值,并对其进行数学运算。 • 表8-2列出了所有日期函数。

  35. 表8.3 日期元素的缩写和取值范围

  36. 例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

  37. 例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

  38. 8.3.3 系统综合函数 • 在这里重点介绍两个数据类型转换函数CAST和CONVERT,在SQL SERVER中,有些数据类型之间会自动进行转换,有些类型之间必须显式地进行转换,而有些类型是不允许转换的。 • 1.CAST函数 • 语法格式为: • CAST(表达式 AS 数据类型):将表达式显式转化为另一种数据类型。

  39. 例8-10:Mary的生日为1980/8/13,请使用日期函数计算Mary的年龄和天数,并以消息的形式输出。例8-10:Mary的生日为1980/8/13,请使用日期函数计算Mary的年龄和天数,并以消息的形式输出。 由datediff得到的年龄和天数均为整数,显示时需要进行类型转换。整数可以出现在SELECT语句中,但不能出现在PRINT语句中,后者只输出字符串。

  40. 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

  41. 2.CONVERT函数 如果希望指定类型转换后数据的样式,则应使用CONVERT函数进行数据类型转换。 语法格式为: CONVERT(数据类型[(长度)], 表达式[, style]) 其中的表达式是任何有效的SQL Server表达式,数据类型只能是系统数据类型,不能是用户自定义的数据类型。

  42. STYLE参数的典型取值

  43. 设置日期输入格式用 SET DATEFORMAT。它用于设置输入DATETIME或SMALLDATATIME 数据的日期部分的顺序。 格式为: SET FORMAT {格式|@格式变量} 格式的有效参数包括mdy(月日年)、dmy(日月年)、ymd(年月日)、ydm(年日月)、myd(月年日)、dym(日年月)。美国英语默认值是mdy。

  44. 例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)

  45. 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)

  46. 8.3.4 数学函数(见表8-6) 常用的有: CEILING(数值表达式):返回大于或等于数值表达式的最小整数。 FLOOR(数值表达式):返回小于或等于数值表达式的最大整数。是CEILING的反函数。 RADIANS(数值表达式):将度数转化为弧度。 RAND([整形表达式]):返回一个1到0之间的随机十进制数。

  47. 例8-12:将180度转化为弧度,并用CEILING和FLOOR函数给出大于它的最小整数和小于它的最大整数。例8-12:将180度转化为弧度,并用CEILING和FLOOR函数给出大于它的最小整数和小于它的最大整数。 • select • 弧度=radians(180.), • 大于的最小整数=ceiling(radians(180.)), • 小于的最大整数=floor(radians(180.))

  48. 8.3.7 行集函数(见表8-9) • 例8-15:使用OPENDATASOURCE函数访问Marketing数据库的“客户信息”表的数据。 • select * • from opendatasource('SQLoledb', • 'data source=WJW-PC;user id=sa').marketing.dbo.客户信息 • go

  49. 8.3.9 配置函数(见8-11) 配置函数给出系统当前的参数,它是全局变量的一部分。 @@language:返回当前使用语言的名称 @@max_connections :返回允许用户同时连接的最大数。 @@servername :返回运行SQL Server 数据库服务器的名称。 @@version :返回SQL Server当前安装的日期、版本和处理其类型。 例8-16:给出SQL Server 的最大连接数。 Select @@max_connections Go

More Related