《t-sql 脚本和批处理》由会员分享,可在线阅读,更多相关《t-sql 脚本和批处理(9页珍藏版)》请在金锄头文库上搜索。
1、 脚本能够将相应的 T-SQL 命令组织起来,实现一个完整的功能目标。脚本提供了变量、分支、循环等控制语句,可以用来实现一些复杂的任务。通过组织一系列的 SQL 命令编成脚本和批处理,也减低了数据库管理的复杂性。1. USE 语句没啥好讲的,功能就是设置当前的数据库。2. 声明变量使用 declare 关键字,语法非常简单: declare , . 可以一次声明多个变量。变量声明后,但未赋值前,其值为 NULL。3. 给变量赋值有两种方法,使用 SET 和使用 select. 当知识该值是确切值或者是其它变量时,使用 SET、当变量赋值基于一个查询时,使用SELECT set Test = 1
2、0; set test=var1select Test=Max(Unitprice) from SalesOrderDetail;4. 系统变量SQL Server 有 30 多个全局系统变量,但以下几个关键的系统变量要记住,经常用到: ERROR : 返回当前连接下,最后执行 T-SQL 语句的错误代码,如无错误则返回 0 FETCH_STATUS : 和 FETCH 配合使用,返回 0 表示 FETCH 有效,%表示超出结果集,-2 表示不存在该行 IDENTITY : 返回最后插入的标识值,作为最后 INSERT 或者 SELECT INTO 语句的结果。 ROWCOUNT : 一个最有
3、用的系统变量,返回最后语句影响的函数 SERVRNAME : 返回脚本正在运行的本地服务器的名字 TRANCOUNT : 返回活动事务的数量。5.批处理批处理是 T-SQL 语句集合的逻辑单元。 在批处理的所有语句被整合成一个执行计划。一个批处理内的所有语句要么被放在一起通过解析,要么没有一句能够执行。 为了将脚本分成多个批处理,需要使用 GO 语句.以下语句被分为三个批处理:USE AdventureWorksDECLARE MyVarchar varchar(50) -This DECLARE only lasts for this batch!SELECT MyVarchar = Hon
4、ey, Im home PRINT Done with first Batch GOPRINT MyVarchar -This generates an error since MyVarchar -isntdeclared in this batchPRINT Done with second BatchGOPRINT Done with third batch - Notice that this still gets executed- even after the errorGO对于以上,每一个批处理都会被独立执行,每个批处理的错误不会阻止其它批处理的运行(批处理 2 发生错误,不被执
5、行,但批处理 3 照样可以执行。) 另外,GO 不是一个 SQL 命令,它只是一个被编辑工具(SQL Server Management Studio,SQLCMD)识别的命令。6.何时使用批处理 批处理有多种用途,但常被用在某些事情不得不放在前面发生,或者不得不和其它事情分开的脚本中。 使用以下几个命令时,必须独自成批处理,包括: CREATE DEFAULT CREATE PROCEDURE CREATE RULE CREATE TRIGGER CREATE VIEW7. 使用批处理建立优先级当需要考虑语句执行的优先顺序时,需要一个任务在另一个任务开始前,前一个任务必须被执行。优先级就需要
6、考虑到。看一下下面的例子: CREATE DATABASE TestUSE TestCREATE TABLE TestTable(col1 int,col2 int) 以上语句不能正确执行,原因何在,是因为在 USE Test 时,必须需要前面一条语句Create DataBase Test”被执行,而要让创建数据库的命令在 USE TEST 时被执行,必须为前面一个语句创建批处理:CREATE DATABASE TestGOUSE TestCREATE TABLE TestTable(col1 int, col2 int) 然后,用以下语句进行验证,发现表确实被创建了: use master
7、;SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = TestTable;8. 创建批处理后的执行可以使用 sqlcmd 命令来执行,一般命令格式如下: c:sqlcmd Usa Ppasswd i mysql.sql sqlcmd 的命令开关包括很多项,以下列出:sqlcmd -U -P | E -S -H -d -l -t -h -s -w -a -e -I -c -L c -q “” -Q “” -m -V -W -u -r 0 | 1 -i -o -f | i: -k 1 | 2 -y -Y -p
8、 1 -R -b -v -A -X 1 -x -? 另外,也可心使用 EXEC 来执行相应的批处理 EXEC (字符串变量)|(字面值命令字符串) EXECUTE (字符串变量 )|(字面值命令字符串)DECLARE InVar varchar(50)DECLARE OutVar varchar(50)- Set up our string to feed into the EXEC commandSET InVar = SELECT OutVar = FirstName FROM Person.Contact WHERE ContactID = 1EXEC (Invar) 执行 EXEC 有
9、许多需要留意的地方,具体可查看 SQL Server2005 高级程序设计10.4节。 9. 流控制语句T-SQL 包括的流控制语句包括: IFELSE GOTO WHILE WAITFOR TRY/CATCH CASE a. IFELSE 语句 IFELSE 语句用得很频繁,其基本语法是: IF | BEGIN ENDELSE| BEGIN END 注意,使用代码行时,别忘了 BEGIN 与 END 另外,对于 IF 判断有一个陷阱,就是 if var = NULL.这样子写法是不对的,因为NULL 不等于任何东西,甚至也不等于 NULL,应该写成: if var IS NULL b. CA
10、SE 语句 有不止一句方式来写 CASE 语句,可以同时输入表达式或布尔表达式协同工作。 第一种选择是使用一个输入表达式,同每一个 WHEN 子句使用的值进行比较,这种CASE 称作简单 CASE: CASE WHEN THEN nELSE END 第二种情况是把每一个 WHEN 子句的布尔值提供给表达式,这种 CASE 叫作搜索CASE: CASEWHEN THEN nELSE END 简单 CASE 需要使用一个能得到布尔值的表达式,例如: SELECT TOP 10 SalesOrderID, SalesOrderID % 10 AS Last Digit, Position =CASE
11、 SalesOrderID % 10WHEN 1 THEN First WHEN 2 THEN SecondWHEN 3 THEN ThirdWHEN 4 THEN FourthELSE Something ElseENDFROM Sales.SalesOrderHeader 以上,得出的结果如下所示: OrderID Last Digit Position - - - 10249 9 Something Else 10251 1 First 10258 8 Something Else 10260 0 Something Else 10265 5 Something Else 10267 7
12、 Something Else 10269 9 Something Else 10270 0 Something Else 10274 4 Fourth 10275 5 Something Else (10 row(s) affected)、 搜索 CASE 和简单 CASE 类似,但有两点微小的差异: 在 CASE 和第一个 WHEN 之间没有输入表达式 WHEN 表达式必须同一个布尔值相比较 SELECT TOP 10 SalesOrderID % 10 AS OrderLastDigit,ProductID % 10 AS ProductLastDigit,“How Close?” =
13、CASEWHEN (SalesOrderID % 10) |BEGINBREAK| CONTINUEEND 看一个例子,使用 WHILE 与 WAITFOR 创建一个监视进程 ,打算每天自动更新一次统计数据: WHILE 1 = 1BEGINWAITFOR TIME 01:00EXEC sp_updatestatsRAISERROR(Statistics Updated for Database, 1, 1) WITH LOGENDd. WAITFOR 语句 WAITFOR 语句表示时间等待,语法如下: WAITFOR DELAY | TIME DELAY 参数指定等待的时间量,不能指定天数,只能指定小时,分钟,秒。最大的延迟时间是 24 小时, WAITFOR DELAY 01:00; 等 1 个小时后执行下面的语句 TIME 参数指定等到一天中某个特定时刻。同样也只能用 24 小时制: WAITFOR TIME 01:00; 等到今天 01:00 时刻执行下面的语句