一.脚本基础
     1.USE语句
          设置当前数据库。
     2.声明变量
          语法:DECLARE @变量名 变量类型
          在声明变量后,给变量赋值之前,变量的值为NULL。
          将系统函数赋给声明的变量,这个方法可以使我们能更安全地使用值,该值只有人为地改变时它才变动。如果直接使用系统函数本身,那么当它发生变动时,有
     时会无法确定其究竟为何,因为大多数系统函数值是由系统确定的。这容易在你不预期的情况下导致系统改变了值,引起不可预期的后果。
          (1).给变量赋值
               SET:当进行变量赋值是,该值已经知道是确切值或者是其他变量时,使用SET。
               SELECT:当变量赋值基于一个查询时,使用SELECT。
          (2).系统函数
               SQL Server 2005中有30多个无参的系统函数,其中一些最重要的如下:
               @@ERROR:                    返回当前连接下,最后执行的T-SQL语句的错误代码,如无错误返回0。
               @@FETCH_STATUS:       和FETCH语句配合使用。
               @@IDENTITY:                返回最后一句运行语句的、自动生成的标识值,作为最后INSERT或者SELECT INTO语句的结果。
               @@ROWCOUNT:              返回最后一个语句影响的行数。
               @@SERVERNAME:          返回脚本正在其上运行的本地服务的名字。
               @@TRANCOUNT:            返回活动事务的数量,特别是针对当前连接的事务的瓶颈程度。

二.批处理
     (1).GO单独占一行。在同一行上,T-SQL语句不能在GO语句之前。
     (2).所有语句从脚本开始处或者上一个GO语句开始编译,直到下一个GO语句或者脚本结束,将这段代码编译到一个执行计划中并相互独立地送往服务器。前一
 个执行计划中发生错误,不会影响后一个执行计划。
     (3).GO不是一个T-SQL命令,只是被编辑工具识别的命令。当编辑工具碰到GO,它把GO看做一个结束批处理的标记,将其打包,然后作为一个独立单元发送到
 服务器——不包括GO,服务器对于GO没有任何概念。          
     1.批处理中的错误
          语法错误,运行时错误。
     2.何时使用批处理
          (1).独自成批处理的语句
               有几个命令必须独自成批处理,它们包括:
                    CREATE DEFAULT
                    CREATE PROCEDURE
                    CREATE RULE
                    CREATE TRIGGER
                    CREATE VIEW
               如果想将这些语句中的任何一条和其他语句组成单独的一个脚本,那么需要采用一个GO语句将它们分别断开,归入各自的批处理中。
          (2).使用批处理建立优先级
               使用批处理最可靠的例子是,当需要考虑语句执行的优先顺序时,也就是说,需要一个任务在另一个任务开始前执行。
               例如:
                    CREATE DATABASE Test

复制代码代码如下:
CREATE TABLE TestTable 

col1 INT, 
col2 INT 
)

执行语句,会发现生成的表没有在Test数据库中,而是在master数据库中(如果当前使用的数据库是系统数据库)。因为在执行脚本的时候,使用的数据
          库是系统数据库,该数据库是当前的,所以生成的表在系统数据库中。看起来,应该在创建表之前指定数据库Test。然而,这样仍然存在问题。解析器试图校
          验代码,发现我们用USE命令引用的数据库并不存在。原因在于创建数据库的语句和创建表的语句写在一个批处理中,在执行该脚本之前,当然数据库还没有
          创建。根据批处理的要求,我们将创建数据库和创建表的脚本用GO语句分为两个独立的批处理。正确代码如下:

复制代码代码如下:
CREATE DATABASE Test 
GO

USE Test 
CREATE TABLE TestTable 

col1 INT, 
col2 INT 
)

三.动态SQL:使用EXE命令生成代码
     语法:EXEC/EXECUTE ({<字符串变量> | '<字面值命令字符串>'})
     1.EXEC的作用域
          真正的调用EXEC语句的行,拥有同该EXEC语句正在运行的批或过程中的其他代码相同的作用域。但是作为EXEC语句结果而被执行的代码,被认为是在它自
     己的批中。
          例如:
          DECLARE @OutVar VARCHAR(50)
          EXEC ('SELECT @OutVar = FirstName FROM Contact WHERE ContactID = 1')
          这里系统会报错,指出必须声明变量@OutVar。因为EXEC的语句独自成为一个批处理,其中的变量不能和其外的作用域相沟通,只在这个批处理中有效。此
     时,@OutVar的值为NULL。正确的写法如下:
          EXEC ('DECLARE @OutVar VARCHAR(50)
                    SELECT @OutVar = FirstName FROM Contact WHERE ContactID = 1')
          这里,我们看到两中不同的作用域,这两种作用域间不能相互沟通。如果不采用外部机制,比如一个临时表,我们就没有办法实现在内部作用域和外部作用域
     之间传递信息。有一个例外的事情是可以在EXEC的区域内部出现,并且也能在EXEC执行后被看到,这就是系统函数。因此,像@@ROWCOUNT这样的变量仍然
     能够被使用。
     2.安全上下文和EXEC
          当赋予某人权利运行一个存储过程,意味着他也能获得权利去执行存储过程内部的动作。比如,有一个存储过程用来列出去年内所有的雇佣员工。其中有权限
     执行该存储过程的人,才能够执行并返回结果——即使他没有权限直接访问人力资源的员工表。
          这样隐含权限对于EXEC语句是无效的。在默认情况下,任何在一个EXEC语句内部建立的参照,都将在当前用户的安全上下文中运行。因此,我们有权利去访
     问一个叫spNewEmployee的存储过程,但是却没有权利去访问员工表。如果spNewEmployee通过一个简单的SELECT语句获得值,那么一切正常。但是如果
     pNewEmployee使用EXEC语句去执行一个SELECT语句,这个EXEC语句将失败——因为没有权利访问员工表。
     3.用户自定义函数和EXEC关联
          不能在同一个语句中同时运行一个函数和EXEC语句。例如:
          DECLARE @Num INT
          SET @Num = 3
          EXEC ('SELECT LEFT(LastName, ' + CAST(@Num AS VARCHAR) + ') AS FilingName FROM Contact')
          这个语句会返回一个错误消息,因为CAST函数需要在EXEC所在行之前被解析。正确代码如下:
          DECLARE @Num INT 
          DECLARE @str VARCHAR(255)
          SET @Num = 3
          SET @str = 'SELECT LEFT(LastName, ' + CAST(@Num AS VARCHAR) + ') AS FilingName FROM Contact'
          EXEC (@str)
          这个例子工作正常,因为EXEC的输入值已经是一个完整的字符串。
     4.EXEC和用户自定义函数
          一般来说,不允许用户自定义函数内部使用EXEC去运行动态SQL,但是,使用EXEC运行一个存储过程,少数情况是合法的。

sqlserver 脚本和批处理指令小结的更多相关文章

  1. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  2. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  3. 分享一个SQLSERVER脚本

    原文:分享一个SQLSERVER脚本 分享一个SQLSERVER脚本 很多时候我们都需要计算数据库中各个表的数据量很每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespac ...

  4. 使用 windows 批处理指令(BAT文件)进行文件删除、复制操作

    以下是做文件删除和复制的批处理指令 ::替换文件需要添加 /y 参数才能直接替换.不然会出现提示是否替换. ::复制Axis2Implementation和WebServices编译后的文件到tomc ...

  5. JSP基础总结(运行机制、脚本元素、指令元素、动作元素)

    JSP的运行机制: 1.转译阶段:JSP页面转换成Servlet类: 2.请求阶段:Servlet类执行,将相应结果发送至客户端. 流程解释: 1.用户访问某个JSP页面 2.服务器找到相应的JSP页 ...

  6. Linux指令小结

    1.apt指令集:是ubuntu中最强大的命令行软件管理工具,用于获取.安装.编译.卸载和查询软件包.还可以检查软件包的依赖关系.在ubunt中下载是根据/etc/apt/sources.list这个 ...

  7. JavaWeb学习----JSP脚本元素、指令元素、动作元素

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. [服务器]脚本:批处理带参数ping命令 发送邮件脚本

    1.批处理带参数ping命令 @echo offecho Input you IP address ......set /p IP=echo Your IP number is %IP%.ping % ...

  9. SQLSERVER 脚本转MYSQL 脚本的方法总结

    1.MYSQL(版本为5.6)中SQL脚本必须以分号(;)结尾,这点比SQLSERVER要严谨:关键字与函数名称全部大写:数据库名称.表名称.字段名称全部小写. 2.所有关键字都要加上``,比如 St ...

随机推荐

  1. Activity设置切换动画时黑屏问题的解决

    //当这么设置的时候.打开Acticity的时候会黑屏一下 overridePendingTransition(R.anim.activity_open,0); //改成例如以下代码 完美解决这个问题 ...

  2. iDempiere = OSGi + ADempiere 一款ERP&CRM&SCM系统、助力中小企业发展

    怀揣着为中小企业量身定做一整套开源软件解决方案的梦想开始了一个网站的搭建.http://osssme.org/ iDempiere = OSGi + ADempiere 一款ERP&CRM&a ...

  3. Linux下默认的目录介绍

    目录/文件 用途 来源 / /处于Linux文件系统树形结构的最顶端,它是Linux文件系统的入口,所有的目录.文件.设备都在/之下. - /bin 该目录存放着系统最常用的最重要的命令,相当于DOS ...

  4. redis主从持久化讨论

    Redis有两种持久化方式,AOF和RDB,AOF持久化是指追加写命令到aof文件的方式,RDB是指定期保存内存快照到rdb文件的方式. RDB虽然可以通过bgsave指令后台保存快照,但fork() ...

  5. C语言 指向结构体变量的指针

    一个指向变量的指针表示的是占内存中起始位置 一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组 定义结构体变量的指针: //假设已有一个结构体名为Stu ...

  6. 分享我们必须知道的高速GTX技术

    eSATA接口只有几根线为什么那么快?连上网线显示的1Gbps是不是很令人兴奋!没错他们都用了高速GTX技术,GTX全称为Gigabit Transceiver,是为了满足现代数字处理技术和计算技术庞 ...

  7. 关于top按钮的网页设置

    方法一: 直接用html实现,没有缓冲的效果,直接彪到顶部. HTMl: <a id="return-top" href="#top"> <s ...

  8. iOS开发多线程篇 09 —NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  9. mockito模拟静态方法

    这里要用到使用powerMock 注意点: 1 @RunWith(PowerMockRunner.class) 2 PowerMockito.mockStatic(StaticTest.class); ...

  10. iOS 学习笔记三【segmentedControl分段控制器详细使用方法】

    在iOS开发过程中,分段控制器的使用频率还是蛮高的,下面是我写的一个简单的demo,大家可以把代码直接复制过去,就可以使用,ios9最新支持. // // ViewController.m // 03 ...