39. SQL -- 批处理及流程控制语句(1)

理及流程控制

 

:(,称批): 是一一起提交SQL Server行的SQL.行批句的,SQL Server将批编译到一个称之为执划的可有助于时间!

假如您必须执10SQL句且你正在一个个的10求并行它,程很浪费时间.且他不能一起被!但你可以在一个批理中行所有的10SQL,程将得很快,所有的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句用于charvarchar型,或可自动转换为字符串型的数据。

 

量:

量分局部量及全局

 

全局量:

全局量在整个SQL Server内使用。存的通常是SQL Server的配置统计数据。在使用全局时应该注意以下几点:全局量是在服的。用只能使用先定的全局量。引用全局,必标记�D@@‖开头全局是只的。局部量的名称不能与全局量的名称相同全局量是SQL Server内部使用的量,其作用范并不仅仅局限于某一程序,而是任何程序均可以随时调用。全局量通常存一些SQL Server的配置统计数据。用可以在程序中用全局量来测试或者是ransact-SQL命令行后的状

使用全局时应该注意以下几点:

①全局量不是由用的程序定的,它是在服的。

②用只能使用先定的全局量。

③引用全局,必标记�D@@‖开头

④局部量的名称不能与全局量的名称相同,否会在用程序中出不可预测果。

一些常用的全局统计

全局量 作用

@@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

 

局部量:

局部量是一个能够拥有特定数据型的象,它的作用范围仅限制在程序内部。局部量可以作为计数器来算循环执行的次数,或是控制循环执行的次数。另外,利用局部

可以保存数据,以供控制流测试以及保存由存储过程返回的数据等。局部量被引用要在其名称前加上�D,而且必先用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合成一个

 

EGINEND 句用于下列情况:

WHILE 需要包含

CASE 函数的元素需要包含

IF ELSE 子句需要包含

法:

BEGIN

{ sql_statement |

statement_block }

END

:

a)Begin...End用来定一个程序,在它里面所有程序将被视为一个

b) 尽管Begin...End几乎可以用在程序中的任何地方,但它最常的用法是和whileif..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 条件该语句:布表达式返回 FALSEIF...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

Declare@number1 int

Set@number1=(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 '不存在!'

 


你可能感兴趣的:(sql,流程控制,批处理)