SQL Server使用T-SQL语句批处理

批处理简介

批处理是作为一个逻辑单元的T-SQL语句。如果一条语句不能通过语法分析,那么不会运行任何语句。如果一条语句在运行时失败,那么产生错误的语句之前的语句都已经运行了。

为了将一个脚本分为多个批处理,可使用GO语句。

GO语句的特点:

  • GO语句必须自成一行,只有注释可以再同一行上。
  • 它使得自脚本的开始部分或者最近一个GO语句以后的所有语句编译成一个执行计划并发送到服务器,与任何其他批处理无关。
  • GO语句不是T-SQL命令,而是由各种SQL Server命令实用程序(如:Management Studio中的"查询"窗口)识别的命令。

1、自成一行

GO命令应当自成一行。在技术上,可以在GO命令之后的同一行开始一个新的批处理,但是这会严重影响可读性。T-SQL语句不能放在GO语句之前,否则GO语句经常会被错误地理解,从而造成语法分析错误或产生一些不可预料的后果。例如,在WHERE子句之后使用一个GO语句。

SELECT * FROM Person WHERE Id = 100 GO

分析器就不知道如何处理。

消息 102,级别 15,状态 1,第 1 行
  'GO' 附近有语法错误。

2、每个批处理单独发送到服务器

因为每个批处理被单独地处理,所以一个批处理中的错误不会阻止另一个批处理运行。要说明这点,请看一下下面的代码。

SELECT 1/0
  GO
  SELECT 0/1

如果这些批处理之间没有任何依赖性,则每个批处理在运行时是完全自治的。

消息 8134,级别 16,状态 1,第 1 行
  遇到以零作除数错误。

  (1 行受影响)

如果这些批处理之间存在依赖性,那么错误发生之后的每个批处理都会失败。依赖性指的是后面的语句,依赖前面执行的结果或变量等等。  

3、GO不是T-SQL命令

一个常见的错误是认为GO是T-SQL命令,其实GO是一个只能被编辑工具(Management Studio)识别的命令。

当编辑工具遇到GO语句时,会将GO语句看做一个终止批处理的标记,将其打包,并且作为一个独立的单元发送到服务器,不包括GO。因为服务器本身根本不知道GO是什么意思。

批处理中错误

批处理中的错误分为以下两类:

  • 语法错误
  • 运行时错误

如果查询分析器发现一个语法错误,那么批处理的处理过程会被立即取消。因为语法检查发生在批处理编译或者执行之前,所以在语法检查期间的一个失败意味着还没有批处理被执行-不管语法错误发生在批处理中的什么位置。

运行时错误的工作方式有很大不同,因为任何在遇到运行时错误之前执行的语句已经完成了,所以除非是未提交事务的一部分,否则这些语句所做的任何事情都已经是现实了。

一般而言,运行时错误将终止从错误发生的地方到此批处理末端的批处理的执行。下一个批处理不影响。

何时使用批处理

使用批处理有若干个理由,但是所有的批处理都有一个共同点-当脚本中的一些事情必须发生在另外一件事情之前或者分开发生时,需要使用批处理。

1.要求有自己的批处理的语句

有一些命令必须有他们自己的批处理。

  • CREATE DEFAULT
  • CREATE PROCEDURE
  • CREATE RULE
  • CREATE TRIGGER
  • CREATE VIEW

如果想在单个脚本中将这些语句中的任意一个和其他语句进行组合,那么需要通过使用GO语句将他们分散到各自的批处理中。

2、使用批处理建立优先权

当需要建立优先权时,就可能用到批处理。也就是说,在下一个任务开始之前,需要全部完成上一个任务。在大多数时候,SQL Server可以很好地处理这种情况 - 脚本中的第一条语句是首先执行的,并且脚本中的第二条语句可以依赖第二条语句运行时服务器所处的适当状态。

下面来看一个例子:

USE master

  CREATE DATABASE Test

  CREATE TABLE TestTable
  (
      col1 int,
      col2 int
  )

当执行上面的脚本,提示命令已成功完成。但是真的没问题吗?

当查看Test数据库时,发现表TestTable并不存在,反而master数据库里多了一个TestTable表。

为什么表被创建在了master数据库中,答案取决于当运行CREATE TABLE语句时,当前数据库是什么。在这个例子中,它恰好是master数据库,所以表就创建在该数据库中。

你可能以为将上述代码改成这样可能就能够解决:

CREATE DATABASE Test

  USE Test

  CREATE TABLE TestTable
  (
      col1 int,
      col2 int
  )

但很遗憾,并不能,错误信息如下:

消息 911,级别 16,状态 1,第 3 行
  数据库 'Test' 不存在。请确保正确地输入了该名称。

分析器尝试验证代码时,发现USE引用一个不存在的数据库,这是批处理语句不可或缺,正确的代码如下:

CREATE DATABASE Test
  GO  --此GO是两主角
  USE Test

  CREATE TABLE TestTable
  (
      col1 int,
      col2 int
  )

就这样加了一个GO之后,问题成功解决。

下面再来看一个例子:

USE Test
  ALTER TABLE TestTable
      ADD col3 int
  INSERT INTO TestTable
      (col1,col2,col3)
  VALUES
      (1,1,1)

以上代码在查询分析器中提示col3列不存在。实际上,以上代码也可以通过一个GO解决。

USE Test
  ALTER TABLE TestTable
      ADD col3 int
  GO  --先更改数据库,然发送插入,此时就是分开进行语法验证了
  INSERT INTO TestTable
      (col1,col2,col3)
  VALUES
      (1,1,1)

到此这篇关于SQL Server批处理T-SQL语句的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SQL Server Transact-SQL编程详解

    目录 变量 1. 局部变量(Local Variable) 2. 全局变量(Global Variable) 输出语句 逻辑控制语句 1. if-else判断语句 2. while…continue…break循环语句 3. case 4. 其他语句 总结 T-SQL语句用于管理SQL Server数据库引擎实例,创建和管理数据库对象,以及查询.插入.修改和删除数据. 变量 1. 局部变量(Local Variable) 局部变量是用户可以自定义的变量,它的作用范围是仅在程序内部,在程序中通常用

  • SQLServer 2008 新增T-SQL 简写语法

    1.定义变量时可以直接赋值 DECLARE @Id int = 5 2.Insert 语句可以一次插入多行数据 INSERT INTO StateList VALUES(@Id, 'WA'), (@Id + 1, 'FL'), (@Id + 2, 'NY') 3.支持+=操作符 SET StateId += 1 完整示例如下: 复制代码 代码如下: CREATE TABLE StateList(StateId int, StateName char(2)) GO -- Declare varia

  • 如何在SQL Server 2008下轻松调试T-SQL语句和存储过程

    今天突然有同事问起,如何在sqlserver中调试存储过程(我们公司使用的是sqlserver 2008 R2),猛地一看,和以前使用sqlserver 2000真的有很大的不同,我真晕了. 于是琢磨了一下.SQLSERVER 2005中不知因何去掉了很重要的DEBUGGER功能,要调试,必须要安装VS2005专业版或者更高版本.非常不方便. 还好,SQLSERVER 2008中这个很重要而且方便的功能又回来了. 不过,SQLSERVER 2008的调试功能和SQL2000的方法差别很大.SQL

  • SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)

    当我们需要批量删除数据库中的表时,对于单个删除一些表是否感到烦躁,厌倦,干脆写个脚本用得了. 本脚本使用游标循环删除,对于数量比较小,用游标暂不会造成恶劣影响. 复制代码 代码如下: DECLARE @tablename VARCHAR(30),@sql VARCHAR(500)DECLARE cur_delete_table CURSOR READ_ONLY FORWARD_ONLY FORSELECT name FROM sysobjects WHERE name LIKE 'PUB%' A

  • SQL Server 的T-SQL高级查询详解

    目录 基本常用查询 嵌套子查询 from (select … table)示例 示例 in, not in子句查询示例 exists和not exists子句查询示例 some.any.all子句查询示例 聚合查询 1. distinct去掉重复数据 2. compute和compute by汇总查询 3. cube汇总 排序函数 基本语法 row_number函数 rank函数函数 dense_rank函数 partition by分组子句 ntile平均排序函数 集合运算 1. union和

  • SQL Server中T-SQL 数据类型转换详解

    常用的转换函数是 cast 和 convert,用于把表达式得出的值的类型转换成另一个数据类型,如果转换失败,该函数抛出错误,导致整个事务回滚.在SQL Server 2012版本中,新增两个容错的转换函数:try_cast 和 try_convert,如果转换操作失败,该函数返回null,不会导致整个事务失败,事务继续执行下去. 注意:对于SQL Server显式定义的不合法转换,try_cast 和 try_convert 会失败,抛出错误信息:Explicit conversion fro

  • Sql Server数据库常用Transact-SQL脚本(推荐)

    Transact-SQL Transact-SQL(又称 T-SQL),是在 Microsoft SQL Server 和 Sybase SQL Server 上的 ANSI SQL 实现,与 Oracle 的 PL/SQL 性质相近(不只是实现 ANSI SQL,也为自身数据库系统的特性提供实现支持),在 Microsoft SQL Server 和 Sybase Adaptive Server 中仍然被使用为核心的查询语言. 数据库 1.创建数据库 USE master ; GO CREAT

  • SQL Server中的T-SQL的基本对象

    1.常量 常量是一个包含文字与数字,十六进制或数字常量.一个字符串常量包含单引号('')或双引号("")字符集中的一个或多个字符. 如果想在单引号分隔的字符串中用到单独的引号,可以在这个字符中用户连续的单引号(即用两个单引号表示单引号).十六进制的常量表示不可打印的字符或者是其他二进制数据.每个十六进制常量都以0x开头,后面附带有字符或者数字. 有效字符常量举例: "abc" "ab .c" "123" 'i don''t'

  • SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例

    SQL Server判断语句(IF ELSE/CASE WHEN ) 执行顺序是 – 从上至下 – 从左至右 --,所当上一个条件满足时(无论下面条件是否满足),执行上个条件,当第一个条件不满足,第二个条件满足时,执行第个二条件 1.IF ELSE 不能用在SELECT中,只能是块,比如: IF - BEGIN -(代码块) END ELSE (注意这里没有ELSE IF,要实现只能在下面的块中用IF判断) BEGIN -(代码块) END 列: declare @num int --定义变量

  • SQL Server如何通过SQL语句直接操作另一台服务器上的SQL SERVER的数据

    SQL Server如何通过SQL语句直接操作另一个SQL SERVER的数据 1. 现在执行SQL语句的数据库服务器开启Ad Hoc Distributed Queries exec sp_configure 'showadvanced options',1 reconfigure exec sp_configure 'Ad HocDistributed Queries',1 reconfigure 2.通过openrowset(‘SQLOLEDB’,’另一个SQLSERVER数据库IP’;

  • 分享一下SQL Server执行动态SQL的正确方式

    SQL Server执行动态SQL的话,应该如何实现呢?下面就为您介绍SQL Server执行动态SQL两种正确方式,希望可以让您对SQL Server执行动态SQL有更深的了解 动态SQL:code that is executed dynamically.它一般是根据用户输入或外部条件动态组合的SQL语句块.动态SQL能灵活的发挥SQL强大的功能.方便的解决一些其它方法难以解决的问题.相信使用过动态SQL的人都能体会到它带来的便利,然而动态SQL有时候在执行性能(效率)上面不如静态SQL,而

  • 详解SQL Server 2008工具SQL Server Profiler

    一.SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 1.图形化监视SQL Server查询: 2.在后台收集查询信息: 3.分析性能: 4.诊断像死锁之类的问题: 5.调试T-SQL语句: 6.模拟重放SQL Server活动: 也可以使用SQL Profiler捕捉在SQL Server实例上执行的活动.这样的活动被称为Profiler跟踪. 1.Profiler跟踪 从开始=>所有程序=>Microsoft SQL Server 2

  • Sql Server中通过sql命令获取cpu占用及产生锁的sql

    获取SQLSERVER中产生锁的SQL语句 SELECT SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) as statement_text FROM sys.dm_exec_qu

  • Sql Server 2008R2升级Sql Server 2012图文教程

    环境: Windows server 2008 r2 Standard +SqlServer2008R2 内网环境需要升级为SQL server 2012 升级安装时提示版本不支持 网上查询相关问题, 必须是SQL server2008 r2 sp1以上及需要安装Sp2补丁包才能升级为SQL server 2012 1)下载地址:微软官网 https://www.microsoft.com/zh-CN/download/details.aspx?id=30437 2)选择你对应的安装SQL se

  • SQL Server的基本功能性语句介绍

    1 注释符注释是指程序代码中不执行的文本字符串,是对程序的说明,可以提高程序的可读性,使程序代码更易于维护,一般嵌入在程序中并以特殊的标记显示出来.在Transact-SQL中,注释可以包含在批处理.存储过程.触发器中,有两种类型的注释符:  --:这是ANSI标准的两个连字符组成的注释符,用于单行注释.  /*-*/:这是与C语言相同的程序注释符,/*用于注释文字的开头,*/用于注释文字的结尾,可以在程序中标识多行文字为注释语句. 2 输出语句(PRINT)输出语句PRINT语句用于把消息传递

  • 详解SQL Server的简单查询语句

    前言 对于一些原理性文章园中已有大量的文章尤其是关于索引这一块,我也是花费大量时间去学习,对于了解索引原理对于后续理解查询计划和性能调优有很大的帮助,而我们只是一些内容进行概括和总结,这一节我们开始正式步入学习SQL中简单的查询语句,简短的内容,深入的理解. 简单查询语句 所有复杂的语句都是由简单的语句组成基本都是由SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY等组成,当然还包括一些谓词等等.比如当我们要查询某表中所有数据时我们会像如下进行. SELECT

  • Access和SQL Server里面的SQL语句的不同之处

    我的感觉是,Accees数据库虽然可以称得上是小型的关系型数据库,并且也是使用的结构化查询语言SQL,但它的语法(主要体现在函数上),却类似vbscript的语法,我想,这应该和Access属于Office系列有关,基于它的开发和应用,自然就与VBA扯上关系,因而Access的函数库也就是VBA的函数库,而非SQL函数库.下面,我们来具体看下Access和SQL Server在查询语句的编写上具体的不同. 一.数据类型转换: Access: SELECT '调查'+CStr(Did) as di

  • SQL Server中的SQL语句优化与效率问题

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhangsan' and tID > 10000 和执行: select * from table1 where tID > 10000 and name='zhangsan' 一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那

随机推荐