批处理及流程控制语句
批处理:(批处理语句,简称批语句): 是一组一起提交给SQL Server执行的SQL语句.当执行批处理语句的时候,SQL Server将批处理语句编译到一个称之为执行计划的可执行单元这有助于节省执行时间!
假如您必须执行10个SQL语句且你正在一个个的发送10个请求并执行它们,这个过程很浪费时间.且他们不能一起被执行!但你可以在一个批处理中执行所有的这10个SQL语句,且执行过程将变得很快,因为所有的SQL语句都一起被发送到SQL Server的服务器!
创建批处理语句:
T--SQL 语句 1
T--SQL 语句 2
T--SQL 语句 3
T--SQL 语句 n
go
注意: go是一个命令,它指定批处理的结果,并且发送SQL 语句到一个SQL Server实例..
当批处理被提交到SQL Server中,它被编译以创建一个执行计划.如果发生任何编译错误:
(1)语法错误,则执行计划不被创建,故批处理中没有语句被执行.(2)但执行计划创建之后,如果发生运行时错误,批处理的执行停止.但遇到运行时错误的语句之前执行的语句不受影响...
创建批处理语句的限制:
a) 不能在一个批语句中定义和使用check约束
b) 不能在一个批语句中撤销对象并重新创建它们
c) 不能在一个批语句中改变表和引用新列
d) 若在一个批语句中存在语法错误,则整个批都不执行
e) 可以使用go语句结束一个批语句,但go并不是T--SQL语句..
DEMO:
use demo_db
go
print ‘table timerecords infor‘
select * from timerecords
where clock_id = ‘105‘
print ‘emp_id count‘
select COUNT(emp_id) as count,CONVERT(char(10),sign_time,121) as sign_time
from timerecords
group by CONVERT(char(10),sign_time,121)
order by CONVERT(char(10),sign_time,121)
go
--PRINT语句用于显示char、varchar类型,或可自动转换为字符串类型的数据。
变量:
变量分为局部变量及全局变量
全局变量:
全局变量在整个SQL Server系统内使用。存储的通常是SQL Server的配置设定值和统计数据。在使用全局变量时应该注意以下几点:全局变量是在服务器级定义的。用户只能使用预先定义的全局变量。引用全局变量时,必须以标记符―@@‖开头。全局变量对用户来说是只读的。局部变量的名称不能与全局变量的名称相同全局变量是SQL Server系统内部使用的变量,其作用范围并不仅仅局限于某一程序,而是任何程序均可以随时调用。全局变量通常存储一些SQL Server的配置设定值和统计数据。用户可以在程序中用全局变量来测试系统的设定值或者是ransact-SQL命令执行后的状值。
使用全局变量时应该注意以下几点:
①全局变量不是由用户的程序定义的,它们是在服务器级定义的。
②用户只能使用预先定义的全局变量。
③引用全局变量时,必须以标记符―@@‖开头。
④局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。
一些常用的全局变量统计:
全局变量 作用
@@CONNECTIONS 返回自上次启动以来连接或试图连接的次数。
@@CURSOR_ROWS 返回连接上最后打开的游标中当前存在的合格行的数量(返回被打开的
游标中还未被读取的有效数据行的行数)
@@DATEFIRST 返回每周第一天的数字
@@ERROR 返回最后执行的SQL 语句的错误代码
@@FETCH_STATUS 返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打
开的游标的状态
@@IDENTITY 返回最后插入的标识值
@@LANGID 返回当前所使用语言的本地语言标识符(ID)。
@@LANGUAGE 返回当前使用的语言名。
@@LOCK_TIMEOUT 返回当前会话的当前锁超时设置,单位为毫秒。
@@PROCID 返回当前过程的存储过程标识符 (ID) 。
@@ROWCOUNT 返回受上一语句影响的行数。
@@SERVERNAME 返回运行 的本地服务器名称。
@@SPID 返回当前用户进程的服务器进程标识符 (ID)。
@@TRANCOUNT 返回当前连接的活动事务数。
@@VERSION 返回当前安装的日期、版本和处理器类型。
@@CPU_BUSY 返回自SQL Server 最近一次启动以来CPU 的工作时间其单位为毫秒
@@DATEFIRST 返回使用SET DATEFIRST 命令而被赋值的DATAFIRST 参数值SET
DATEFIRST,命令用来指定每周的第一天是星期几
@@DBTS 返回当前数据库的时间戳值必须保证数据库中时间戳的值是惟一的
@@ERROR 返回执行Transact-SQL 语句的错误代码
@@FETCH_STATUS 返回上一次FETCH 语句的状态值
@@IDLE 返回自SQL Server 最近一次启动以来CPU 处于空闭状态的时间长短
单位为毫秒
@@IO_BUSY 返回自SQL Server 最近一次启动以来CPU 执行输入输出操作所花费
的时间其单位为毫秒
@@LANGID 返回当前所使用的语言ID 值
@@LANGUAGE 返回当前使用的语言名称
@@LOCK_TIMEOUT 返回当前会话等待锁的时间长短其单位为毫秒
@@MAX_CONNECTIONS 返回允许连接到SQL Server 的最大连接数目
@@MAX_PRECISION 返回decimal 和numeric 数据类型的精确度
@@NESTLEVEL 返回当前执行的存储过程的嵌套级数初始值为0
@@OPTIONS 返回当前SET 选项的信息
@@PACK_RECEIVED 返回SQL Server 通过网络读取的输入包的数
@@PACK_SENT 返回SQL Server 写给网络的输出包的数目
@@PACKET_ERRORS 返回网络包的错误数目
@@PROCID 返回当前存储过程的ID 值
@@REMSERVER 返回远程SQL Server 数据库服务器的名称
@@SERVICENAME 返回SQL Server 正运行于哪种服务状态之下如MSSQLServer
MSDTC SQLServerAgent
@@SPID 返回当前用户处理的服务器处理ID 值
@@TEXTSIZE 返回SET 语句的TEXTSIZE 选项值SET 语句定义了SELECT 语句中
text 或image 数据类型的最大长度基本单位为字节
@@TIMETICKS 返回每一时钟的微秒数
@@TOTAL_ERRORS 返回磁盘读写错误数目
@@TOTAL_READ 返回磁盘读操作的数目
@@TOTAL_WRITE 返回磁盘写操作的数目
@@TRANCOUNT 返回当前连接中处于激活状态的事务数目
DEMO:
Select @@connections
返回结果:
9456
DEMO:利用全局变量查看sql server的版本、当前所使用的sql server服务器的名称
以及所使用的服务器的服务名称等信息。
print ‘目前所用sql server的版本信息‘
print @@version --版本
print ‘目前所用sql server服务器的名称:‘+ @@servername --服务器的名称
print ‘目前所用服务器的服务名称:‘+ @@servicename --服务名称
go
返回结果:
目前所用sql server的版本信息
Microsoft SQL Server 2008 (RTM) -10.0.1600.22 (X64)
Jul 9 2008 14:17:44
Copyright (c) 1988-2008 MicrosoftCorporation
Enterprise Edition (64-bit) onWindows NT 6.1 <X64> (Build 7600: ) (VM)
目前所用sql server服务器的名称:SQL2008
目前所用服务器的服务名称:MSSQLSERVER
局部变量:
局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。局部变量可以作为计数器来计算循环执行的次数,或是控制循环执行的次数。另外,利用局部
变量还可以保存数据值,以供控制流语句测试以及保存由存储过程返回的数据值等。局部变量被引用时要在其名称前加上标志―@‖,而且必须先用DECLARE命令定义后才可以使用。利用局部变量还可以保存程序执行过程中的中间数据值,保存由存储过程返回的数据值等。局部变量的名称以一个@字符开始,由用户自己定义和赋值局部变量的定义:必须先用DECLARE命令定义后才可以使用。
DECLAER {@local_variabledata_type} […n]
局部变量的赋 .方法 : 局部变量名 数据类型
SET {{ @local_variable = expression }
或者:
SELECT{ @local_variable = expression } [ ,...n ] 表达式
DEMO:声明两个局部变量,并对它们进行赋值,然后将变量的值显示出来。代码如下:
declare@nowdate char(10),@disp varchar(30)
set @nowdate=getdate()
set @disp=‘现在的日期为‘
print@disp+@nowdate
返回:
现在的日期为8 2011
流程控制语句
流程控制语句是指那些用来控制程序执行和流程分支的命令,在SQL Server 2000中,流程控制语句主要用来控制SQL语句、语句块或者存储过程的执行流程。SQL Server中程序流程结构:
a) 顺序型结构
b) 判断选择型结构 if..else语句和case语句
c) 循环控制结构 while语句...
SQLServer中程序语句:
a) 注释符
b) 批处理
c) 块语句Begin...End
d) 判断语句if...else语句
e)if..exists语句
f)case语句
g)print语句
h)WHILE…CONTINUE…BREAK语句
i)GOTO语句
j)WAITFOR语句
k)RETURN语句
A、块语句Begin...End
BEGINEND语句能够将多个Transact-SQL语句组合成一个语句块,并将它们视为一个单元处理。在条件语句和循环等控制流程语句中,当符合特定条件便要执行两个或者多个语句时,就需要使用BEGINEND语句,将多个T-sql语句组合成一个语句块。
EGIN和END 语句用于下列情况:
WHILE 循环需要包含语句块。
CASE 函数的元素需要包含语句块。
IF 或 ELSE 子句需要包含语句块。
语法:
BEGIN
{ sql_statement |
statement_block }
END
说明:
a)Begin...End用来设定一个程序块,在它里面所有程序将被视为一个单元执行
b) 尽管Begin...End几乎可以用在程序中的任何地方,但它最常见的用法是和while或if..else组合使用...
c) 在Begin...End中可以嵌套另外的Begin--End来定义另一程序块..
Begin...End语句块与其它编程语言有所不同的就是,在语句块中声明的SQL变量其作用域是在声明后的整个批中,而不是仅仅局限于这个语句块.但在大多数编程语言中这种写法的错误的.
DEMO:
declare@id int --声明SQL局部变量
set @id=1 --使用set语句为该SQL变量赋值
if(@id=1)
Begin--Begin语句块
declare@str varchar(10) --声明SQL局部变量
set @str= ‘bcy‘ --使用set语句为该SQL变量赋值
End
select‘[‘+@str+‘]‘
go
DEMO:创建一个测试表,并循环写入500条数据,使用newid():
declare@num int =1
while@num <=500
begin
print‘test‘
set @num=@num+1
end
判断语句if...else语句
IF…ELSE语句是条件判断语句,其中:ELSE子句是可选的,简单的IF语句没有ELSE子句部分。IF…ELSE语句用来判断当某一条件成立时执行某段程序,条件不成立时执行另一段程序。SQL Server允许嵌套使用IF…ELSE语句,而且嵌套层数没有限制。
注意:如果布尔表达式中包含一个SELECT语句,则必须使用圆括号扩起来。
如果满足条件,则在 IF 关键字及其条件之后执行Transact-SQL 语句:布尔表达式返回 TRUE。可选的 ELSE 关键字引入另一个 Transact-SQL 语句,当不满足 IF 条件时就执行该语句:布尔表达式返回 FALSE。IF...ELSE 构造可用于批处理、存储过程和即时查询。当此构造用于存储过程时,通常用于测试某个参数是否存在。
语法:
IFELSE 语句:
IFBoolean_expression 条件表达式
{sql_statement | statement_block } 语句序列
[ ELSE
{sql_statement | statement_block } ]
IF <条件表达式>
<命令行或程序块>
[ELSE [条件表达式]
<命令行或程序块>]
IFELSE 可以嵌套使用,最多可嵌套32 级
DEMO1:在uspGetList 存储过程的输出中使用了 IFELSE。该存储过程在创建存储过
程中定义。在此示例中,该存储过程返回标价低于 700 美元的自行车清单。这将导致执
行第一个 PRINT 语句
DECLARE@compareprice money, @cost money
EXECUTEProduction.uspGetList ‘%Bikes%‘, 700,
@comparepriceOUT,
@costOUTPUT
IF @cost <= @compareprice
BEGIN
PRINT‘These products canbe purchased for less than
$‘+RTRIM(CAST(@compareprice AS varchar(20)))+‘.‘
END
ELSE
PRINT‘The prices for allproducts in this category exceed
$‘+ RTRIM(CAST(@compareprice AS varchar(20)))+‘.‘
DEMO2:创建一个随机数/2,看是否余数为0,若为0,返回a,若不为0,返回b
declare@num int
set @num =(convert(int,RANd(11)*100000))
if @num % 2=0
print‘a‘
else
print‘b‘
DEMO3:
Usemarket
if (select 库存量
fromgoods
where货品名称=彩电‘)<30
Begin
[email protected] int
[email protected]=(select 库存量 from goods
where货品名称=彩电‘)
Print彩电的库存量为:‘+cast(@number1 as char(3))
Print该商品库存量已不足,提醒进货!‘
end
/*cast函数用于将某种数据类型的表达式转换为另一种数据类型。*/
DEMO4:
Usemarket
ifexists(select *
fromgoods
where状态=0) --判断库存量是否为空
Begin
select货品名称、库存量
fromgoods
where状态=0
Print‘商品尚不能出售’
end
Else
Begin
select货品名称、库存量
fromgoods
where状态=1
Print‘该商品可以出售!’
end
if exists语句
if exists 语句用来检测数据是否存在,而不考虑与之匹配的总共行数..
语法:
if [not] exists (select 子查询)
SQL 语句或语句块1
[else]
SQL 语句或语句块2 ...
说明:
a) SQL Server 服务器只要找到第一个匹配的行(记录),就停止执行select 子查询语句.
b) if 语句最多可以嵌套150 层..
DEMO:
if exists(select *
from student
where name= ‘杨育键‘
and
)
select ‘杨育键存在! ‘
else
select ‘杨育键不存在!‘