…… 举例declare @msg varchar(40) declare @myqty int, @myid char(4)
3.3.1.2 为局部变量赋值
局部变量被声明时, 它的初值为NULL , 使用SELECT语句将指定值赋给局部变量。 语法select @var = expression [,@var = expression ] [from…[where…]… 举例declare @var1 int select @var1=99
3.3.1.2 为局部变量赋值
注意 — 在一个赋值给局部变量的select 语句中, 可以使用常数、 从表中取值、或使用表达式给局部变量赋值。 — 不能使用同一SELECT 语句既给局部变量赋值,又检索 数据返回给客户。 — 一个赋值给局部变量的SELECT 语句,不向用户显示任 何值。
3.3.1.3 对局部变量的限制
局部变量必须先用DECLARE定义,再用SELECT语句赋值后才能使用。 局部变量只能使用在T-SQL语句中使用常量的地方。 局部变量不能使用在表名、列名、其它数据库对象名、保留字使用的地方。 局部变量是标量,它们拥有一个确切的值。 赋值给局部变量的SELECT语句应该返回单个值。如果赋值的SELECT语句没有返 回值,则该局部变量的值保持不变;如果赋值的SELECT语句返回多个值,则该局 部变量取最后一个返回的值。
3.3.1.4 使用局部变量时通常发生的错误
在程序中, 使用局部变量通常容易发生的错误是数据类型不 匹配。 即使用DECLARE 语句定义局部变量的数据类型与赋值 给局部变量的值的数据类型不匹配。 如果发生这种情况,SQL Server 总是试图隐式转换为局部变量的数据类型。
3.3.2 全局变量
全局变量( Gloabal Variable )是SQL Server系统提供并赋值的变量。 用户不能建立全局变量,也不能使用SELECT语句去修改全局变量的 值。全局变量的名字用@@开始。大多数全局变量的值报告本次SQL Server启动后发生的系统活动,可以使用系统存储过程sp_monitor显 示全局变量的当前值。通常全局变量的值赋给在同一批中的局部变 量,以便保存和作进一步处理
3.3.2.1 常用的全局变量
全局变量@@error @@rowcount @@version 赋给的值 由最近一个语句产生的错误号 被最近一个语句影响的行数SQL Server的版本号 允许与该SQL Server连接的最大用户个数
@@max_connections @@Servername 、
该SQL Server的名字
3.3.2.2 全局变量举例
举例select @@version declare @book_price money select @book_price = price from titles where title_id = 'BU1032' if @@rowcount = 0 print 'no such title_id' else begin print 'title_id exists with' select 'price of' = @book_price end
4 存储过程中的流程控制语言
流程控制SQL语句的执行顺序,这在存储过程、触发器、批中非常有用。流控制 关键字(命令)包括:IF ELSE IF EXISTS 和IF NOT EXISTS BEGIN…END RETURN WHILE BREAK和CONTINUE WAITFOR PRINT
4.1 IF ELSE
部分语法(ASE) if boolean_expression statement [else [if boolean_expression1] statement1 ] 部分语法(IQ) if boolean_expression then statement [else [if boolean_expression1] statement1 ] End if
4.2 IF EXISTS 和IF NOT EXISTS
功能 当你关心数据是否存在时,在IF 语句中使用[NOT] EXISTS 是很有用的。 语法(ASE) 语法if [not] exists (select statement) statement block
4.2 IF EXISTS 和IF NOT EXISTS
举例(ASE) 举例/* 是否存在姓“Smith”的作者*/ declare @lname varchar(40) select @lname = 'Smith' if exists ( select * from authors where au_lname = @lname)
select 'here is a ' + @lname else select 'here is no author called'+@lname
4.3 BEGIN…END
功能 当需要将一个以上的SQL 语句作为一组语句对待时, 可以 使用BEGIN 和END 将它们括起来形成一个SQL 语句块。从 语法上看,一个SQL 语句块相当于一个SQL 语句。在流控制 语言中, 允许用一个SQL 语句块替代单个SQL 语句出现的地 方。
4.3 BEGIN…END
语法BEGIN statement block END 这里:statement block 通常为一个以上的SQL 语句。当然也可是 一个SQL 语句。
4.4 RETURN
功能RETURN 命令无条件退出它所在的批、 存储过程或触发器。 退出时,能选择提供返回状态。RETURN 语句之后的任何语 句不被执行。 语法RETURN [integer_expression]
4.4 RETURN
举例if not exists ( select * from titles where title_id = @t_id) begin print 'here is no title by this title_id' return --无条件退出批,其后语句不被执行。insert salesdetail values
(@s_id, @o_num, @t_id,@qty_sold, @disc) end go
4.5 WHILE
功能WHILE 关键字为要重复执行的某一语句或语句块设置条件, 当指定的条件为真(TRUE )时,执行这一语句或语句块, 直到条件为假( FALSE ) 或执行BREAK 语句。语句块是由BEGIN 和END 括起来的两个或两个以上的语句构成
4.5 WHILE
语法(ASE) 语法while boolean exprission statement block 语法(IQ) 语法while boolean exprission loop statement block end loop
4.5 WHILE
举例while (select avg(price) from titles) < $40 begin select title_id, price from titles where price > $20 update titles set price = price + $2 end select title_id, price from titles print "Too much for the market to bear"
4.6 BREAK和CONTINUE
功能 BREAK和CONTINU关键字控制在WHILE循环中语句块中语句的执 行。 —BREAK关键字将退出它所在的循环,继续执行后面的语句(即跳过 从关键字BREAK到它所在循环结束END之间的所有语句)。
|