《【精品】transact-sql程序设计(可编辑.ppt》由会员分享,可在线阅读,更多相关《【精品】transact-sql程序设计(可编辑.ppt(132页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Transact-SQL程序设计本章内容本章内容9.1 数据与表达式数据与表达式9.3 程序控制流语句程序控制流语句9.2 函函 数数9.4 游标管理与应用游标管理与应用9.1 数据与表达式数据与表达式9.1.1 用户定义数据类型用户定义数据类型9.1.2 常量与变量常量与变量9.1.3 运算符与表达式运算符与表达式9.1 9.1 数据与表达式数据与表达式9.1.1 用户定义数据类型用户定义数据类型1使用系统存储过程来创建用户定义数据类使用系统存储过程来创建用户定义数据类型型,命令格式如下:命令格式如下:sp_addtype typename=type,phystype=system_data
2、_type ,nulltype=null_type ,owner=owner_name 9.1.1 9.1.1 用户定义数据类型用户定义数据类型例如,为例如,为Sales数据库创建数据库创建个不允许为个不允许为NULL值的值的test_add用户定义数据类型。用户定义数据类型。USE SalesGOEXEC sp_addtype test_add,Varchar(10),NOT NULLGOn此后,此后,test_add可用为数据列或变量的数据可用为数据列或变量的数据类型。类型。9.1.2 9.1.2 常量与变量常量与变量1常量常量n常量是表示特定数据值的符号,其格式取决于其数常量是表示特定数
3、据值的符号,其格式取决于其数据类型据类型(1)字符串和二进制常量字符串和二进制常量字符串常量字符串常量括在单引号内括在单引号内并包含字母数字字符并包含字母数字字符(a-z、A-Z 和和 0-9)以及特殊字符,如感叹号以及特殊字符,如感叹号(!)、at 符符()和数字号和数字号(#)。例如:例如:Cincinnati、OBrien、Process X is 50%complete.、“OBrien”为字符串常量。为字符串常量。二进制常量二进制常量具有前辍具有前辍0 x并且是十六进制数字字符串,并且是十六进制数字字符串,它它们不使用引号们不使用引号。例如。例如0 xAE、0 x12Ef、0 x69
4、048AEFDD010E、0 x(空串空串)为二进制常量。为二进制常量。(2)日期日期/时间常量时间常量ndatetime常量常量使用特定格式的字符日期值表示,使用特定格式的字符日期值表示,用单引用单引号括起来号括起来。n输入时,可以使用输入时,可以使用“/”、“.”、“-”作日期作日期/时间常量的分隔时间常量的分隔符。符。输输入格式入格式datetime值值Smalldatetime值值Sep 3,2005 1:34:34.1222005-09-03 01:34:34.1232005-09-03 01:35:009/3/2005 1PM2005-09-03 13:00:00.0002005-
5、09-03 13:00:009.3.2005 13:002005-09-03 13:00:00.0002005-09-03 13:00:0013:25:191900-01-01 13:25:19.0001900-01-01 13:25:009/3/20052005-09-03 00:00:00.0002005-09-03 00:00:009.1.2 9.1.2 常量与变量常量与变量(3)数值常量数值常量整型常量整型常量由由没有用引号括起来没有用引号括起来且不含小数点的一串数字表且不含小数点的一串数字表示。例如,示。例如,1894、2为整型常量。为整型常量。浮点常量浮点常量主要采用科学记数法表示
6、,例如,主要采用科学记数法表示,例如,101.5E5、0.5E-2为浮点常量。为浮点常量。精确数值常量精确数值常量由没有用引号括起来且包含小数点的一串数由没有用引号括起来且包含小数点的一串数字表示。例如,字表示。例如,1894.1204、2.0为精确数值常量。为精确数值常量。货币常量货币常量是以是以“$”为前缀的一个整型或实型常量数据,不为前缀的一个整型或实型常量数据,不使用引号。例如,使用引号。例如,$12.5、$542023.14为货币常量。为货币常量。uniqueidentifier常量是表示全局惟一标识符常量是表示全局惟一标识符GUID值的字值的字符串。可以使用字符或二进制字符串格式指
7、定。符串。可以使用字符或二进制字符串格式指定。9.1.2 9.1.2 常量与变量常量与变量n逻辑数据常量逻辑数据常量使用数字使用数字0或或1表示,表示,并且不并且不使用引号使用引号。非。非0的数字当作的数字当作1处理。处理。(5)空值空值n在数据列定义之后,还需确定该列是否允在数据列定义之后,还需确定该列是否允许空值许空值(NULL)。允许空值意味着用户在向。允许空值意味着用户在向表中插入数据时可以忽略该列值。表中插入数据时可以忽略该列值。空值空值可可以表示整型、实型、字符型数据。以表示整型、实型、字符型数据。(4)逻辑数据常量逻辑数据常量9.1.2 9.1.2 常量与变量常量与变量n变量用于
8、临时存放数据,变量中的数据随变量用于临时存放数据,变量中的数据随着程序的运行而变化,变量有名字与数据着程序的运行而变化,变量有名字与数据类型两个属性。类型两个属性。n变量的命名使用常规标识符,即以字母、变量的命名使用常规标识符,即以字母、下划线下划线(_)、at符号符号()、数字符号、数字符号(#)开头,开头,后续字母、数字、后续字母、数字、at符号、美元符号符号、美元符号($)、下划线的字符序列。不允许嵌入空格或其下划线的字符序列。不允许嵌入空格或其他特殊字符。他特殊字符。2变量变量9.1.2 9.1.2 常量与变量常量与变量n全全局局变变量量由由系系统统定定义义并并维维护护,通通过过在在名
9、名称称前面加前面加“”符号符号n局部变量局部变量的首字母为单个的首字母为单个“”。全局变量和局部变量全局变量和局部变量9.1.2 9.1.2 常量与变量常量与变量(1)局部变量局部变量n局部变量使用局部变量使用DECLARE语句定义语句定义DECLARE local_variable data_type,.nn变量名最大长度为变量名最大长度为30个字符。一条个字符。一条DECLARE语句可以定义多个变量,各变量语句可以定义多个变量,各变量之间使用逗号隔开。之间使用逗号隔开。n例如例如DECLARE name varchar(30),type int9.1.2 9.1.2 常量与变量常量与变量局
10、部变量的赋值局部变量的赋值 用用SELECT为局部变量赋值为局部变量赋值SELECT variable_name=expression,nFROM WHERE n例如例如DECLARE int_var intSELECT int_var=12 /*给给int_var赋值赋值*/SELECT int_var /*将将int_var的值输出到屏幕上的值输出到屏幕上*/9.1.2 9.1.2 常量与变量常量与变量在一条语句中可以同时对几个变量进行赋值在一条语句中可以同时对几个变量进行赋值n例如例如DECLARE LastName char(8),Firstname char(8),BirthDate
11、 datetimeSELECT LastName=Smith,Firstname=David,BirthDate=1985-2-20SELECT LastName,Firstname,BirthDaten局部变量没有被赋值前,其值是局部变量没有被赋值前,其值是NULL,若要在,若要在程序中引用它,必须先赋值。程序中引用它,必须先赋值。9.1.2 9.1.2 常量与变量常量与变量例例9-1 使用使用SELECT语句从语句从student表中检索表中检索出学生编号为出学生编号为“007”的行,再将学生的名字赋的行,再将学生的名字赋给变量给变量sn,并显示出来。,并显示出来。ndeclare sn
12、char(10)nselect sn=snamenfrom studentnwhere sno=007nselect sn9.1.2 9.1.2 常量与变量常量与变量利用利用UPDATE为局部变量赋值为局部变量赋值例例9-2 将将student表中的表中的sno列值为列值为“007”的的age列的改列的改变后的值赋给局部变量变后的值赋给局部变量age。select*from studentDECLARE age intUPDATE studentSET age=age*2WHERE sno=007select age9.1.2 9.1.2 常量与变量常量与变量 用用SET给局部变量赋值给局部变
13、量赋值nSET语句格式为:语句格式为:SET local_variable=expressionn使用使用SET初始化变量的方法与初始化变量的方法与SELECT语句相同,语句相同,但一个但一个SET语句只能为一个变量赋值。语句只能为一个变量赋值。例例9-3 计算计算student表的记录数并赋值给局部变量表的记录数并赋值给局部变量rows。DECLARE rows intSET rows=(SELECT COUNT(*)FROM student)print rows9.1.2 9.1.2 常量与变量常量与变量Print和和select的区别的区别nDECLARE var intnSELECT
14、var=2nPRINT varnDECLARE var intnSELECT var=2nSELECT varn用用select语句显示的附加信息在用语句显示的附加信息在用print语句时不语句时不显示显示print和变量和变量n使用使用print语句在屏幕上显示用户定义的消息语句在屏幕上显示用户定义的消息或变量的内容或变量的内容print输出的仅仅是输出的仅仅是ASCII字符字符串或字符类型的变量串或字符类型的变量(最多最多255字符字符)如:如:print 苹果苹果n若要输出更复杂的内容,要将字符串存入字若要输出更复杂的内容,要将字符串存入字符变量,然后输出该变量符变量,然后输出该变量Se
15、lect apple=苹果苹果苹果苹果苹果苹果Print apple(2)全局变量全局变量n全局变量通常被服务器用来跟踪服务器范全局变量通常被服务器用来跟踪服务器范围和特定会话期间的信息,不能显式地被围和特定会话期间的信息,不能显式地被赋值或声明。赋值或声明。n全局变量不能由用户定义全局变量不能由用户定义,也不能被应用,也不能被应用程序用来在处理器之间交叉传递信息。程序用来在处理器之间交叉传递信息。9.1.2 9.1.2 常量与变量常量与变量 rowcountnrowcount存储前一条命令影响到的记录存储前一条命令影响到的记录总数,除了总数,除了DECLARE语句之外,其他任何语句之外,其他
16、任何语句都可以影响语句都可以影响rowcount的值。的值。n例如例如DECLARE rows intSELECT rows=rowcount9.1.2 9.1.2 常量与变量常量与变量 errorn如果如果error为非为非0值,则表明执行过程中产生了错误,值,则表明执行过程中产生了错误,此时应当在程序中采取相应的措施加以处理。此时应当在程序中采取相应的措施加以处理。nerror的值与的值与rowcount一样,会随着每一条一样,会随着每一条SQL Server语句的变化而改变。语句的变化而改变。例例9-4 使服务器产生服务,并用显示错误号。使服务器产生服务,并用显示错误号。raiserro
17、r(miscellaneous error message,16,1)/*产生一个错误产生一个错误*/if error0SELECT error as last errorn运行结果:运行结果:服务器服务器:消息消息 50000,级别,级别 16,状态,状态 1,行,行 1miscellaneous error messagelast error0 9.1.2 9.1.2 常量与变量常量与变量9.1 9.1 数据与表达式数据与表达式9.1.3 运算符与表达式运算符与表达式n运算符运算符用来执行数据列之间的数学运算或用来执行数据列之间的数学运算或比较操作。比较操作。n表达式表达式是符号与运算符的
18、组合。是符号与运算符的组合。n简单的表达式可以是一个常量、变量、列简单的表达式可以是一个常量、变量、列或函数,复杂表达式是由运算符连接一个或函数,复杂表达式是由运算符连接一个或多个简单表达式。或多个简单表达式。9.1.3 9.1.3 运算符与表达式运算符与表达式1.算术运算符与表达式算术运算符与表达式n算术运算符用于数值型列或变量间的算术运算。算术运算术运算符用于数值型列或变量间的算术运算。算术运算符包括加算符包括加(+)、减、减(-)、乘、乘(*)、除、除(/)和取模和取模(%)运算等。运算等。例例9-9 使用使用“+”将将goods表中高于表中高于9000的商品价格增加的商品价格增加15元
19、:元:SELECT goods_name,unit_price,(unit_price+15)AS nowprice FROM goodsWHERE unit_price9000n运行结果如图所示。运行结果如图所示。9.1.3 9.1.3 运算符与表达式运算符与表达式2.位运算符与表达式位运算符与表达式n位运算符用以对数据进行按位与位运算符用以对数据进行按位与()、或、或(|)、异或、异或()、求反、求反()等运算。等运算。&运算运算只有当两个表达式中的两个位值都为只有当两个表达式中的两个位值都为1时,结果时,结果中的位才被设置为中的位才被设置为1,否则结果中的位被设置为,否则结果中的位被设置
20、为0。|运算运算时,如果在两个表达式的任一位为时,如果在两个表达式的任一位为1或者两个位均或者两个位均为为1,那么结果的对应位被设置为,那么结果的对应位被设置为1;如果表达式中的;如果表达式中的两个位都不为两个位都不为1,则结果中该位的值被设置为,则结果中该位的值被设置为0。运算运算时,如果在两个表达式中,只有一位的值为时,如果在两个表达式中,只有一位的值为1,则结果中位的值被设置为则结果中位的值被设置为1;如果两个位的值都为;如果两个位的值都为0或或者都为者都为1,则结果中该位的值被清除为,则结果中该位的值被清除为0。9.1.3 9.1.3 运算符与表达式运算符与表达式例如,例如,170与与
21、75进行进行&运算运算n先将先将170和和75转换为二进制数转换为二进制数0000 0000 1010 1010和和0000 0000 0100 1011,再进行,再进行&运算的结果是运算的结果是0000 0000 0000 1010,即十进,即十进制数制数10。n同样,表达式同样,表达式52,1,5|2的运算结果为:的运算结果为:7,0,7。9.1.3 9.1.3 运算符与表达式运算符与表达式3.比较运算符与表达式比较运算符与表达式n比较运算符比较运算符用来比较两个表达式的值是否相同,用来比较两个表达式的值是否相同,可用于字符、数字或日期数据。可用于字符、数字或日期数据。nSQL Serve
22、r中的比较运算符有大于中的比较运算符有大于()、小于、小于(=)、小于等于、小于等于(=)和不等于和不等于(!=)等,比等,比较运算返回布尔值,通常出现在条件表达式中。较运算返回布尔值,通常出现在条件表达式中。n比较运算符的比较运算符的结果为布尔数据类型结果为布尔数据类型,其值为,其值为TRUE、FALSE。n例如,表达式例如,表达式2=3的运算结果为的运算结果为FALSE。9.1.3 9.1.3 运算符与表达式运算符与表达式4.逻辑运算符与表达式逻辑运算符与表达式n逻辑运算符逻辑运算符与与(AND)、或、或(OR)、非、非(NOT)等,等,用于对某个条件进行测试,以获得其真实用于对某个条件进
23、行测试,以获得其真实情况。情况。n逻辑运算符和比较运算符一样,返回逻辑运算符和比较运算符一样,返回TRUE或或FALSE的布尔数据值。的布尔数据值。9.1.3 9.1.3 运算符与表达式运算符与表达式表表9-5 逻辑运算符逻辑运算符运算符运算符含含 义义AND如果两个布如果两个布尔尔表达式都表达式都为为TRUE,那么,那么结结果果为为TRUE。OR如果两个布如果两个布尔尔表达式中的一个表达式中的一个为为TRUE,那么,那么结结果就果就为为TRUE。NOT对对任何其他布任何其他布尔尔运算符的运算符的值值取反。取反。LIKE如果操作数与一种模式相匹配,那么如果操作数与一种模式相匹配,那么值为值为T
24、RUE。IN如果操作数等于表达式列表中的一个,那么如果操作数等于表达式列表中的一个,那么值为值为TRUE。ALL如果一系列的比如果一系列的比较较都都为为TRUE,那么,那么值为值为TRUE。ANY如果一系列的比如果一系列的比较较中任何一个中任何一个为为TRUE,那么,那么值为值为TRUE。BETWEEN如果操作数在某个范如果操作数在某个范围围之内,那么之内,那么值为值为TRUE。EXISTS如果子如果子查询查询包含一些行,那么包含一些行,那么值为值为TRUE。9.1.3 9.1.3 运算符与表达式运算符与表达式n逻辑运算符通常和比较运算一起构成更为逻辑运算符通常和比较运算一起构成更为复杂的表达
25、式。逻辑运算符的操作数都只复杂的表达式。逻辑运算符的操作数都只能是布尔型数据。能是布尔型数据。例如,在表例如,在表employee中查找中查找1973年以前与年以前与1980年以后出生的男员工的表达式为:年以后出生的男员工的表达式为:(year(birth_date)1980)AND sex=男男9.1.3 9.1.3 运算符与表达式运算符与表达式LIKE运算符运算符n确定给定的字符串是否与指定的模式匹配,通常确定给定的字符串是否与指定的模式匹配,通常只限于字符数据类型。只限于字符数据类型。LIKE的通配符如下表的通配符如下表运算符运算符描描 述述示示 例例%包含零个或多个字符的任意字符包含零
26、个或多个字符的任意字符串。串。address LIKE%公司公司%将将查查找地址任找地址任意位置包含公司的所有意位置包含公司的所有职员职员。_下划下划线线,对应对应任何任何单单个字符。个字符。employee_name LIKE _海燕海燕 将将查查找以找以“海燕海燕”结结尾的所有尾的所有6个字符的名字。个字符的名字。指定范指定范围围(a-f)或集合或集合(abcdef)中的任何中的任何单单个字符。个字符。employee_name LIKE 张张李王李王海燕海燕 将将查查找找张张海燕、李海燕、王海燕等。海燕、李海燕、王海燕等。不属于指定范不属于指定范围围(a-f)或集合或集合(abcdef)
27、的任何的任何单单个字符。个字符。employee_name LIKE 张张李李海燕海燕 将将查查找不姓找不姓张张、李的名、李的名为为海燕的海燕的职员职员。9.1.3 9.1.3 运算符与表达式运算符与表达式例如例如,查找所有姓查找所有姓“钱钱”的员工及住址的员工及住址SELECT employee_name,addressFROM employeeWHERE employee_name LIKE 钱钱%9.1.3 9.1.3 运算符与表达式运算符与表达式4连接运算符与表达式连接运算符与表达式n连接运算符连接运算符(+)用于两个字符串数据的连接,用于两个字符串数据的连接,通常也称为字符串运算符。
28、通常也称为字符串运算符。n在在SQL Server中,对字符串的其他操作通中,对字符串的其他操作通过字符串函数进行。字符串连接运算符的过字符串函数进行。字符串连接运算符的操作数类型有操作数类型有char、varchar和和text等。等。n例如,例如,Dr.+Computer的运算结果的运算结果:Dr.Computer9.1.3 9.1.3 运算符与表达式运算符与表达式5运算符的优先级别运算符的优先级别nSQL Server中各种运算符的优先顺序如下:中各种运算符的优先顺序如下:()|*、/、%+、-NOT AND OR排在前面的运算符的优先级高于其后的运算符排在前面的运算符的优先级高于其后的
29、运算符。在一个表达式中,先计算优先级较高的运算,后在一个表达式中,先计算优先级较高的运算,后计算优先级低的运算,相同优先级的运算按自左计算优先级低的运算,相同优先级的运算按自左向右的顺序依次进行。向右的顺序依次进行。9.3 程序控制流语句程序控制流语句9.3.1 语句块和注释语句块和注释9.3.2 选择控制选择控制9.3.3 循环控制循环控制9.3.4 批处理批处理9.3 9.3 程序控制流语句程序控制流语句9.3.1 语句块和注释语句块和注释nTransact-SQL提供了控制流语言的特殊关提供了控制流语言的特殊关键字和用于编写过程性代码的语法结构,键字和用于编写过程性代码的语法结构,可进行
30、可进行顺序、分支、循环、存储过程、触顺序、分支、循环、存储过程、触发器等程序设计发器等程序设计,编写结构化的模块代码,编写结构化的模块代码,并放置到数据库服务器上。并放置到数据库服务器上。9.3.1 9.3.1 语句块和注释语句块和注释nBEGIN.END用来设定一个语句块,将在用来设定一个语句块,将在BEGIN.END内的所有语句视为一个逻辑单元执内的所有语句视为一个逻辑单元执行。行。n语句块语句块BEGIN.END的语法格式为:的语法格式为:BEGIN sql_statement|statement_block END1.语句块语句块BEGIN.END9.3.1 9.3.1 语句块和注释语
31、句块和注释USE ssGODECLARE sn char(10)BEGIN SELECT sn=(SELECT sname FROM student WHERE sno LIKE 007)SELECT snEND例例9-21 显示显示ss数据库中数据库中student表的编号为表的编号为007的联系人姓名。的联系人姓名。9.3.1 9.3.1 语句块和注释语句块和注释在在BEGIN.END中可嵌套另外的中可嵌套另外的BEGIN.END来定义另一程序块。来定义另一程序块。例例9-22 语句块嵌套举例。语句块嵌套举例。DECLARE errorcode int,nowdate dateTIMEBE
32、GIN SET nowdate=getdate()INSERT sell_order(order_date,send_date,arriver_date,custom_id)VALUES(nowdate,nowdate+5,nowdate+10,C0002)SELECT errorcode=error IF errorcode0 BEGIN RAISERROR(当表当表sell_order插入数据时发生错误插入数据时发生错误!,16,1)RETURN ENDEND9.3.1 9.3.1 语句块和注释语句块和注释2.注释注释n有两种方法来声明注释:有两种方法来声明注释:单行注释单行注释多行注释。
33、多行注释。9.3.1 9.3.1 语句块和注释语句块和注释(1)单行注释)单行注释n在语句中,使用在语句中,使用两个连字符两个连字符“-”开头开头,则从此开始,则从此开始的整行或者行的一部分就成为了注释,的整行或者行的一部分就成为了注释,注释在行的注释在行的末尾结束。末尾结束。-This is a comment.Whole line will be ignored.SELECT employee_name,address -查询所有姓钱的员工查询所有姓钱的员工FROM employeeWHERE employee_name LIKE 钱钱%n注释的部分不会被注释的部分不会被SQL Serve
34、r执行。执行。9.3.1 9.3.1 语句块和注释语句块和注释(2)多行注释)多行注释n多行注释方法是多行注释方法是SQL Server自带特性,自带特性,可以注释大块跨越可以注释大块跨越多行的代码多行的代码,它必须用一对分隔符,它必须用一对分隔符“/*/”将余下的其他代将余下的其他代码分隔开。码分隔开。/*This is a commnetAll these lines will be ignored.*/*List all employees.*/SELECT*FROM employeen注释并没有长度限制。注释并没有长度限制。SQL Server文档禁止嵌套多行注释,文档禁止嵌套多行注释
35、,但但单行注释可以嵌套在多行注释中单行注释可以嵌套在多行注释中。/*-List all employees.SELECT*FROM employee*/9.3 9.3 程序控制流语句程序控制流语句9.3.2 选择控制选择控制1.条件执行语句条件执行语句IFELSE必须必须IF.ELSE结构根据条件表达式的值,以决定结构根据条件表达式的值,以决定执行哪些语句。执行哪些语句。nIF.ELSE的语法格式为:的语法格式为:IF Boolean_expression sql_statement|statement_block -条件表达式为真时执行条件表达式为真时执行 ELSE sql_statemen
36、t|statement_block -条件表达式为假时执行条件表达式为假时执行9.3.2 选择控制选择控制IF(SELECT AVG(age)FROM student)50 PRINT 他们是最佳的客户他们是最佳的客户ELSE IF(SELECT SUM(order_num)FROM sell_order)30 PRINT 必须与他们保持联络必须与他们保持联络 ELSE PRINT 再想想办法吧再想想办法吧!9.3.2 选择控制选择控制2.CASE函数函数nCASE函数计算多个条件并为每个条件返回单个值。函数计算多个条件并为每个条件返回单个值。(1)简单简单CASE函数:将某个表达式与一组简单
37、表达式进行比较以确定结函数:将某个表达式与一组简单表达式进行比较以确定结果。果。CASE input_expression WHEN when_expression THEN result_expression .n ELSE else_result_expression END(2)CASE搜索函数,搜索函数,CASE计算一组逻辑表达式以确定结果。计算一组逻辑表达式以确定结果。CASE WHEN Boolean_expression THEN result_expression .n ELSE else_result_expression END9.3.2 选择控制选择控制例例9-26 使用
38、简单使用简单CASE函数将函数将goods表中的商表中的商品分类重命名,以使之更易理解。品分类重命名,以使之更易理解。SELECT CASE classification_id WHEN P001 THEN 笔记本计算机笔记本计算机 WHEN P002 THEN 激光打印机激光打印机 WHEN P003 THEN 喷墨打印机喷墨打印机 WHEN P004 THEN 交换机交换机 ELSE 没有这种品牌没有这种品牌 END AS Classification,goods_name AS Goods Name,unit_price AS PriceFROM goodsWHERE unit_pric
39、e IS NOT NULL9.3.2 选择控制选择控制SELECT goods_name AS 商品名称商品名称,CASE WHEN stock_quantity-order_quantity3 and stock_quantity-order_quantity10 THEN 货物充足货物充足 END AS 进货判断进货判断FROM goods例例9-27 根据根据goods表中库存货物数量与订货量之差,表中库存货物数量与订货量之差,使用使用CASE搜索函数判断该商品是否进货。搜索函数判断该商品是否进货。Caseend多路选择多路选择nUSE pubsnGOnSELECT Price Cate
40、gory=nCASE n WHEN price IS NULL THEN Not yet pricedn WHEN price=10 and price 20 THEN Coffee n Table Titlen ELSE Expensive book!nENDnFROM titlesnORDER BY pricenGO9.3.2 选择控制选择控制3.跳转语句跳转语句GOTOnGOTO语句将允许程序的执行转移到标签处语句将允许程序的执行转移到标签处,GOTO语句的语法格式如下:语句的语法格式如下:GOTO label其中,其中,label为为GOTO语句处理的起点。语句处理的起点。label必
41、必须符合标识符规则。须符合标识符规则。9.3.2 选择控制选择控制例例9-28 使用使用GOTO语句改变程序流程。语句改变程序流程。DECLARE x int SELECT x=1label_1:SELECT x SELECT x=x+1 WHILE xy RETURNELSE RETURN9.3 9.3 程序控制流语句程序控制流语句9.3.3 循环控制循环控制nWHILE语句根据条件表达式设置语句根据条件表达式设置Transact-SQL语句或语语句或语句块重复执行的次数。如果所设置的条件为真(句块重复执行的次数。如果所设置的条件为真(TRUE)时,在时,在WHILE循环体内的循环体内的Tr
42、ansact-SQL语句会一直重复语句会一直重复执行,直到条件为假(执行,直到条件为假(FALSE)为止。)为止。nWHILE循环语句的语法格式如下:循环语句的语法格式如下:WHILE boolean_expression sql_statement|statement_block BREAK sql_statement|statement_block CONTINUE While、break和和continuenContinue使程序跳过使程序跳过continue语句后面的语句后面的语句,回到语句,回到while循环的第一行命令循环的第一行命令-跳跳出当前循环出当前循环nBreak语句使程序
43、完全跳出循环,结束语句使程序完全跳出循环,结束while语句的执行语句的执行-跳出整个循环跳出整个循环nDECLARE count intnSELECT count=11nWHILE count0nBEGINnSELECT Count=Count-1nIF count=4nBEGINnBREAKnENDnIF count=6nBEGINnCONTINUEnENDnPRINT countnEND练习练习n计算计算1到到100求和求和nDeclare s int,i intnSet i=1nSet s=0nWhile i=100n beginn set s=s+in set i=i+1n endn
44、Print 1+2+3+.+100=+cast(s as char(25)9.3 9.3 程序控制流语句程序控制流语句DECLARE s int,n int,t int,c intSET s=0SET n=1WHILE n=10BEGIN SET c=1 SET t=1 WHILE c=n BEGIN SET t=t*c SET c=c+1 END SET s=s+t SET n=n+1ENDSELECT s,n例例9-32 计算计算s=1!+2!+10!。9.3 9.3 程序控制流语句程序控制流语句9.3.4 批处理批处理n一个批处理是一个批处理是条或多条条或多条Transact-SQL语句
45、的集合。语句的集合。nSQL Server服务器对批处理的处理分为四个阶段:服务器对批处理的处理分为四个阶段:分析阶段,服务器检查命令的语法,验证表和列的名字的合法性分析阶段,服务器检查命令的语法,验证表和列的名字的合法性优化阶段,服务器确定完成一个查询的最有效的方法;优化阶段,服务器确定完成一个查询的最有效的方法;编译阶段,生成该批处理的执行计划;编译阶段,生成该批处理的执行计划;运行阶段,运行阶段,条一条地执行该批处理中的语句。条一条地执行该批处理中的语句。n批处理最重要的特征就是它作为一个不可分的实体在服务批处理最重要的特征就是它作为一个不可分的实体在服务器上解释和执行。在一些情况下批处
46、理被隐式地设定。例器上解释和执行。在一些情况下批处理被隐式地设定。例如,用查询分析器来执行一组如,用查询分析器来执行一组Transact-SQL语句,这组语语句,这组语句将被视为一个批处理来对待。句将被视为一个批处理来对待。9.3 9.3 程序控制流语句程序控制流语句nSQL Server有以下几种指定批处理的方法。有以下几种指定批处理的方法。(1)应用程序作为一个执行单元发出的所有应用程序作为一个执行单元发出的所有SQL语句构成一语句构成一个批处理,并生成单个执行计划。个批处理,并生成单个执行计划。(2)存储过程或触发器内的所有语句构成一个批处理。每个存储过程或触发器内的所有语句构成一个批处
47、理。每个存储过程或触发器都编译为一个执行计划。存储过程或触发器都编译为一个执行计划。(3)由由EXECUTE语句执行的字符串是一个批处理,并编译为语句执行的字符串是一个批处理,并编译为一个执行计划。例如,一个执行计划。例如,EXEC(SELECT*FROM employee)(4)由由sp_executesql系统存储过程执行的字符串是一个批处理,系统存储过程执行的字符串是一个批处理,并编译为一个执行计划。例如,并编译为一个执行计划。例如,execute sp_executesql NSELECT*from Sales.dbo.employee 1.批处理的指定批处理的指定9.3 9.3 程序
48、控制流语句程序控制流语句nGO是批处理的结束标志。当编译器执行到是批处理的结束标志。当编译器执行到GO时会把时会把GO前面的所有语句当成一个批处理来执行。前面的所有语句当成一个批处理来执行。nGO命令和命令和Transact-SQL语句不可处在同一行上。但在语句不可处在同一行上。但在GO命令行中可以包含注释。命令行中可以包含注释。n在批处理的第一条语句后执行任何存储过程必须包含在批处理的第一条语句后执行任何存储过程必须包含EXECUTE关键字。局部关键字。局部(用户定义用户定义)变量的作用域限制在变量的作用域限制在一个批处理中,不可在一个批处理中,不可在GO命令后引用。命令后引用。nRETUR
49、N可在任何时候从批处理中退出,而不执行位于可在任何时候从批处理中退出,而不执行位于RETURN之后的语句。之后的语句。2.批处理的结束与退出批处理的结束与退出9.3 9.3 程序控制流语句程序控制流语句USE SalesGO -批处理结束标志批处理结束标志CREATE VIEW employee_infoASSELECT*FROM employeeGO-CREATE VIEW语句与其他语句隔离语句与其他语句隔离SELECT*FROM employee_infoGO 例例9-33 创建一个视图,使用创建一个视图,使用GO命令将命令将CREATE VIEW语句与批处理中的其他语句语句与批处理中的其
50、他语句(如如USE、SELECT语句等语句等)隔离。隔离。9.2 函函 数数9.2.1 常用函数常用函数9.2.2 用户定义函数用户定义函数9.2 9.2 函函 数数9.2.1 常用函数常用函数n函数是函数是组编译好的组编译好的Transact-SQL语句,它们可语句,它们可以带一个或一组数值做参数,也可不带参数,它以带一个或一组数值做参数,也可不带参数,它返回一个数值、数值集合,或执行一些操作。返回一个数值、数值集合,或执行一些操作。n函数能够重复执行一些操作,从而避免不断重写函数能够重复执行一些操作,从而避免不断重写代码。代码。nSQL Server 2000支持两种函数类型:支持两种函数