理解T-SQL: 脚本和批处理

      脚本能够将相应的T-SQL命令组织起来,实现一个完整的功能目标。脚本提供了变量、分支、循环等控制语句,可以用来实现一些复杂的任务。通过组织一系列的SQL命令编成脚本和批处理,也减低了数据库管理的复杂性。

1. USE语句

     没啥好讲的,功能就是设置当前的数据库。

2. 声明变量

     使用declare关键字,语法非常简单:
       declare @<变量名> <变量类型> [,@<变量名> <变量类型> [.. ]]
    可以一次声明多个变量。变量声明后,但未赋值前,其值为NULL。

3. 给变量赋值

     有两种方法,使用SET和使用select.
    当知识该值是确切值或者是其它变量时,使用SET、当变量赋值基于一个查询时,使用SELECT

     set @Test = 10;    set @test=@var1
     
select @Test=Max(Unitprice) from SalesOrderDetail;



4. 系统变量

      SQL Server有30多个全局系统变量,但以下几个关键的系统变量要记住,经常用到:
     @@ERROR                :    返回当前连接下,最后执行T-SQL语句的错误代码,如无错误则返回0
     @@FETCH_STATUS   :     和FETCH配合使用,返回0表示FETCH有效,%表示超出结果集,-2表示不存在该行
     @@IDENTITY            :     返回最后插入的标识值,作为最后INSERT或者SELECT INTO语句的结果。
     @@ROWCOUNT        :     一个最有用的系统变量,返回最后语句影响的函数
     @@SERVRNAME        :    返回脚本正在运行的本地服务器的名字
     @@TRANCOUNT        :    返回活动事务的数量。

 

5.批处理

     批处理是T-SQL语句集合的逻辑单元。 在批处理的所有语句被整合成一个执行计划。一个批处理内的所有语句要么被放在一起通过解析,要么没有一句能够执行。
    为了将脚本分成多个批处理,需要使用GO语句.以下语句被分为三个批处理:

USE AdventureWorks
DECLARE @MyVarchar varchar(50--This DECLARE only lasts for this batch!
SELECT @MyVarchar = ‘Honey, I’’m home
PRINT ‘Done with first Batch
GO
PRINT @MyVarchar --This generates an error since @MyVarchar   --isn’t declared in this batch
PRINT ‘Done with second Batch’
GO
PRINT ‘Done with third batch’ -- Notice that this still gets executed -- even after the error
GO

 

     对于以上,每一个批处理都会被独立执行,每个批处理的错误不会阻止其它批处理的运行(批处理2发生错误,不被执行,但批处理3照样可以执行。)
     另外,GO不是一个SQL命令,它只是一个被编辑工具(SQL Server Management Studio,SQLCMD)识别的命令。

 

6.何时使用批处理

      批处理有多种用途,但常被用在某些事情不得不放在前面发生,或者不得不和其它事情分开的脚本中。
     使用以下几个命令时,必须独自成批处理,包括:
     ● CREATE DEFAULT
     ● CREATE PROCEDURE
     ● CREATE RULE
     ● CREATE TRIGGER
     ● CREATE VIEW

 

7. 使用批处理建立优先级

      当需要考虑语句执行的优先顺序时,需要一个任务在另一个任务开始前,前一个任务必须被执行。优先级就需要考虑到。看一下下面的例子:  

CREATE DATABASE Test
USE Test
CREATE TABLE TestTable
(
col1 
int,
col2 
int
)


     以上语句不能正确执行,原因何在,是因为在USE Test时,必须需要前面一条语句"Create DataBase Test”被执行,而要让创建数据库的命令在USE TEST时被执行,必须为前面一个语句创建批处理:

CREATE DATABASE Test
GO
USE Test
CREATE TABLE TestTable
(
    col1 
int,
    col2 
int
)


    然后,用以下语句进行验证,发现表确实被创建了:

use master;
SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ‘TestTable’;


 

8. 创建批处理后的执行

     ●可以使用sqlcmd命令来执行,一般命令格式如下:
      c:\>sqlcmd –Usa –Ppasswd –i mysql.sql
    sqlcmd的命令开关包括很多项,以下列出:

sqlcmd
[ { { -U <login id> [ -P <password> ] } | –E <可信连接>} ]
[-S <服务器名> [ \<实例名> ] ] [ -H <工作站名> ] [ -d <数据库名> ]
[ -l <登录超时> ] [ -t <查询超时> ] [ -h <标题(间行数)> ]
[ -s <列分隔符> ] [ -w <列宽> ] [ -a <分组大小> ]
[ -e ] [ -I ]
[ -c <批处理终止符> ] [ -L [ c ] ] [ -q “<query>” ] [ -Q “<query>” ]
[ -m <error level> ] [ -V ] [ -W ] [ -u ] [ -r [ 0 | 1 ] ]
[ -i <input file> ] [ -o <output file> ]
[ -f <代码页> | i:<输入代码页> [ <, o: <输出代码页> ]
[ -k [ 1 | 2 ] ]
[ -y <可变类型显示宽度> ] [-Y <固定类型显示宽度> ]
[ -p [ 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 command
SET @InVar = ‘SELECT @OutVar = FirstName FROM Person.Contact WHERE ContactID = 1
EXEC (@Invar)



    执行EXEC有许多需要留意的地方,具体可查看《SQL Server2005高级程序设计》10.4节。

9. 流控制语句

     T-SQL包括的流控制语句包括:
       ● IF…ELSE
       ● GOTO
       ● WHILE
       ● WAITFOR
       ● TRY/CATCH
       ● CASE

    a. IF…ELSE语句
       IF…ELSE语句用得很频繁,其基本语法是:

IF <Boolean Expression>
<SQL statement> | BEGIN <code series> END
[ELSE
<SQL statement> | BEGIN <code series> END
]


       注意,使用代码行时,别忘了BEGIN与END
       另外,对于IF判断有一个陷阱,就是 if @var = NULL.这样子写法是不对的,因为NULL不等于任何东西,甚至也不等于NULL,应该写成:
         if @var IS NULL

     b. CASE语句
         有不止一句方式来写CASE语句,可以同时输入表达式或布尔表达式协同工作。
         第一种选择是使用一个输入表达式,同每一个WHEN子句使用的值进行比较,这种CASE称作简单CASE: 

CASE <input expression>
WHEN <when expression> THEN <result expression>
[n]
[ELSE <result expression>]
END


         第二种情况是把每一个WHEN子句的布尔值提供给表达式,这种CASE叫作搜索CASE:

CASE
WHEN <Boolean expression> THEN <result expression>
[n]
[ELSE <result expression>]
END



        ●● 简单CASE需要使用一个能得到布尔值的表达式,例如:

SELECT TOP 10 SalesOrderID, SalesOrderID % 10 AS ‘Last Digit’, Position =
CASE SalesOrderID % 10
    
WHEN 1 THEN ‘First’
    
WHEN 2 THEN ‘Second’
    
WHEN 3 THEN ‘Third’
    
WHEN 4 THEN ‘Fourth’
ELSE  ‘Something Else
END
FROM 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               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?” = 
CASE
     
WHEN (SalesOrderID % 10< 3 THEN ‘Ends With Less Than Three’
     
WHEN ProductID = 6 THEN ‘ProductID is 6
     
WHEN ABS(SalesOrderID % 10 - ProductID) <= 1 THEN ‘Within 1
ELSE
   ‘More Than One Apart’
END
FROM Sales.SalesOrderDetail


         得到的结果如下所示:
OrderLastDigit       ProductLastDigit       How Close?
--------------       ----------------       -------------------
2                               5                   More Than One Apart
3                               2                   More Than One Apart
3                              9                   More Than One Apart
3                               8                   More Than One Apart
2                               2                   More Than One Apart
2                              8                  More Than One Apart
1                              7                   Within 1
1                               0                  Within 1
1                              1                   Within 1
0                              2                  Exact Match!
        搜索CASE把条件放到了WHEN后面,而不是所有的WHEN共用一个条件!

    

    C. WHILE语句
            WHILE语句的语法如下所示:

WHILE <Boolean expression>  <sql statement> |
[BEGIN
     <statement block>
     [BREAK
]
      
<sql statement> | <statement block>
     
[CONTINUE]
END]


          看一个例子,使用WHILE与WAITFOR创建一个监视进程 ,打算每天自动更新一次统计数据:

WHILE 1 = 1
BEGIN
       
WAITFOR TIME ‘01:00
       
EXEC sp_updatestats
       
RAISERROR(‘Statistics Updated for Database’, 11WITH LOG
END


       d. WAITFOR语句
           WAITFOR语句表示时间等待,语法如下:
WAITFOR
       DELAY <’time’> | TIME <’time’>
           DELAY参数指定等待的时间量,不能指定天数,只能指定小时,分钟,秒。最大的延迟时间是24小时,

WAITFOR DELAY  ‘01:00‘; 等1个小时后执行下面的语句


           TIME参数指定等到一天中某个特定时刻。同样也只能用24小时制: 

WAITFOR TIME ‘01:00’;  等到今天01:00时刻执行下面的语句


转载于:https://www.cnblogs.com/shipfi/archive/2009/10/14/1582899.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~

凉凉&#xff01;面试阿里我被Redis技术专题给弄死了~ &#x1f4da;我本以为我可以像是别的博主一样去阿里面试随随便便&#xff0c;因为Redis&#xff0c;我直接被阿里大佬淦翻在地上 好了不装了 没过没关系 我总结了一些这些最难的知识点&#xff01;&#xff01;&#xff0…

与众不同 制作会唱歌的WinRAR - imsoft.cnblogs

为了使用方便&#xff0c;我们可能会把RAR压缩包制作成自解压文件。WinRAR自带的自解压模块虽然使用很方便&#xff0c;但千篇一律的外观看起来实在 乏味。其实&#xff0c;只要通过简单改造&#xff0c;你就可以制作出与众不同&#xff0c;声色俱佳的WinRAR自解压界面&#xf…

看到这一幕,我甚至都想戒烟了。。 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;

c#3.0关于JSON简单操作的实用帮助类(泛型实现)

关于json的操作&#xff0c;网上一搜一大把。避免重复造轮子&#xff0c;整理发布一个笔者在项目开发中经常用到的一个json实用帮助类&#xff0c;泛型实现&#xff0c;非常方便。不废话了&#xff0c;贴代码&#xff1a;1、json操作的帮助类&#xff1a; Codeusing System;usi…

谁还没个黑历史了。。。 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;

C# 虚方法与抽象方法区别

虚方法是必须要实现的&#xff0c;只有接口或者抽象方法才没有实现体&#xff0c;什么是实现体&#xff0c;就是方法的那对大括号&#xff1a;下面举例&#xff1a;public abstract void Fn1();//定义一个抽象方法 public vitrual void Fn2(){ };//定义一个虚方法(那对大括号必…

京东面试官:呦,你对中间件 Mycat了解的还挺深~

1.数据切分概念 数据的切分[&#xff08;Sharding&#xff09;]根据其切分规则的类型&#xff0c;可以分为两种切分模式。一种是按照不同的表&#xff08;或者Schema&#xff09;来切分到不同的数据库&#xff08;主机&#xff09;)之上&#xff0c;这种切可以称之为数据的垂直…

Redis与Memcached的区别

2019独角兽企业重金招聘Python工程师标准>>> 传统MySQL Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的&#xff0c;通过Memcached将热点数据加载到cache&#xff0c;加速访问&#xff0c;很多公司都曾经使用过这样的架构&#xff0c;但随着业务数据量…

“高仿版拼多多”宣告破产!曾一年收割1.3亿用户,如今自救失败负债16亿

全世界只有3.14 % 的人关注了青少年数学之旅又一家改变世界的互联网公司跑路了啊&#xff1f;挣扎数月的淘集集最终也回天乏术了。淘集集并购重组最终失败&#xff0c;供应商何时能拿到被拖欠的货款仍然遥遥无期。这家主打比“拼多多”更下沉市场的社交电商&#xff0c;平台上线…

处在哪个阶段?

在职业生涯中&#xff0c;可以划分出多个阶段&#xff0c;但是如下3个阶段也许是最粗糙和实在的&#xff1a; 1、入门级&#xff0c;在别人的领导下可以完成工作。 2、成熟级&#xff0c;可以独立完成工作。 3、精英级&#xff0c;可以领到别人完成工作。 你处在哪个阶段&#…

在VS Code中直接调试Web程序,是怎样一种体验?

前言要在VS Code中启动Chrome或Microsoft Edge中调试任何Web程序&#xff0c;您只需按F5或选择菜单"运行"->"启动调试"来启动会话。你可以选择在Chrome、Edge或Node.js中进行调试。Edge DevTools如果选择了Edge进行调试&#xff0c;你会发现调试工具条上…

面试官问:你做过什么Java线程池实践,我写了一篇博客给他看~

线程池大家都## 标题很熟悉&#xff0c;无论是平时的业务开发还是框架中间件都会用到&#xff0c;大部分都是基于JDK线程池ThreadPoolExecutor做的封装&#xff0c; 都会牵涉到这几个核心参数的设置&#xff1a;核心线程数&#xff0c;等待(任务)队列&#xff0c;最大线程数&am…

【Blog.Idp开源】支持在线密码找回

&#xff08;一个做认证平台&#xff0c;必须会遇到的一个问题&#xff09;BCVP框架&#xff0c;是基于:ASP.NETCore5.0VUE.jsIdentityServer4等核心技术&#xff0c;实现的前后端分离与动态认证鉴权一体化平台。01密码找回认证中心绕不开的话题Architecture Design.无论你是自…

我的狗丢了,所以我能加你微信吗? | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;

将VC++6.0的代码迁移到VS2005常见问题总结(Window核心编程第五版以前代码在VS2005无法编译的解决方案)...

额喜新厌旧是男人的通病吧&#xff0c;可是呢VS2005的界面看着的确比VC6.0看着舒服&#xff0c;而且也算用习惯了吧。可是网上现在大部分C/C的代码还是用VC6.0的。这为我们这些菜鸟的学习之路增添了不少障碍&#xff0c;可能有很多朋友在这一步就放弃了吧或者抹黑走下去&#x…

被问到了!为什么一定要使用分布式,内行啊

一、为什么要使用分布式 如果需求要测试 4000 虚拟用户数&#xff0c;而本机只能支持1000 虚拟用户&#xff0c;如果测试结果有可能是电脑的问题&#xff0c;而不是服务器的问题&#xff0c;所以需要把其他虚拟用户分配到多台电脑上 把虚拟用户数分配到其他电脑上面去执行&am…

设计模式之享元

享元模式介绍享元模式主要在于共享通用对象&#xff0c;减少内存的使用&#xff0c;提升系统的访问效率。而这部分共享对象通常比较耗费内存或者需要查询大量接口或者使用数据库资源&#xff0c;因此统一抽离作为共享对象使用。在使用此模式过程中&#xff0c;需要使用享元工厂…

真正拉开人与人之间的差距是什么?

全世界只有3.14 % 的人关注了青少年数学之旅身边总有些人看上去很轻松&#xff0c;不仅在工作中游刃有余&#xff0c;还知识渊博&#xff0c;对各种事情有自己的思考。这样的人一定是天生的学霸吧。其实学习不一定要在教室里从一本书的第一页开始看&#xff0c;学习可以很轻松。…

[导入]【翻译】WF从入门到精通(第八章):调用外部方法及工作流

摘要: 学习完本章&#xff0c;你将掌握&#xff1a; 1.创建并调用你的工作流外部的本地数据服务 2.理解怎样使用接口来为宿主进程和你的工作流之间进行通信。 3.使用设计的外部方法在你的工作流和宿主应用程序之间传输数据。 4.在一个正执行的工作流中调用其它工作流 阅读全文…

(译)Windsor入门教程---第三部分 编写第一个Installer

原文&#xff1a;http://docs.castleproject.org/Windsor.Windsor-tutorial-ASP-NET-MVC-3-application-To-be-Seen.ashx 简介 在第二部分我们创建了控制器工厂。现在我们要把我们的控制器交给Windsor来管理。 Installer Windsor有一个专门的类installer.cs&#xff0c;用来向容…