【问题标题】:What is a batch?什么是批次?
【发布时间】:2009-11-09 21:13:23
【问题描述】:

在 Transact-SQL 中,批处理是一组一起提交并作为一组执行的 SQL 语句,一个接一个。批处理可以存储在命令文件中。

包含多个 SQL 语句的 *.sql 文件是否被视为一个批处理?我们还考虑什么批次?

【问题讨论】:

  • 这个问题只和tsql有关吗?闻起来有点像作业……
  • 堆栈需要一个名为“batch-tsql”的标签。
  • @djangofan 拥有 +1500 代表的人需要先创建“batch-tsql”标签。

标签: sql tsql


【解决方案1】:

包含多个 sql 语句的 *.sql 文件是否被视为一个批处理?

有点。 *.sql 文件通常是一个批次,但它也可以包含多个批次。您可以通过批次分隔符分隔单独的批次。您可能需要在一个文件中包含多个批处理,因为某些语句(尤其是某些 ALTER 命令)每个批处理只能执行一次。这会使在循环中执行 ALTERs 之类的事情变得棘手,因为某些语句 (SET) 将在批处理结束时应用,并且因为 Sql Server 将具有在每个批处理结束时提交的隐式事务。

这里的另一个技巧是如何在文件/文档中分离各个批次。在 99% 的 Sql Server 工具中,批处理分隔符是“GO”。但是,这是该工具可配置的。它不是 SQL 语言本身的一部分,因此您可能会不时遇到使用其他东西的奇怪人,或者如果您直接向其发送“GO”命令,SQL Server 会抱怨它而感到困惑。

【讨论】:

  • 1) 我不确定我是否理解为什么有批处理是一件好事(我意识到某些语句每批处理只能执行一次,但如果批处理不存在,那么我们不会没有那个问题),那么为什么Sql server开发团队认为引入批处理是个好主意?! 2) 除了某些语句在一个批次中只能执行一次之外,还有什么其他原因可以让我们将一堆语句放入几个不同的批次中,而不是将它们全部放入一个批次中?
  • 某些其他语句(SET 选项)将应用到批处理结束。
  • 现在已经旧了,但如果不存在批次就不会有问题的想法,那是不正确的。如果批次不存在,您必须在单独的文件会话中发送这些语句。如果您在同一批次中使用多个语句,那么没有人会做额外的工作来制作像 ALTER 中断这样的语句,只是因为。那将是愚蠢的。相反,在实施ALTER 时,结果发现有一些额外的问题需要注意,而且他们还没有付出额外的努力来使它们在同一批中安全工作。
【解决方案2】:

批处理不是 TSQL 的一部分,它们是 SQL Management Studio 编辑器的功能。因此,例如,您不能提交带有“GO”作为命令文本的一部分的 ADO.NET 命令对象。

批处理标记 - “GO”告诉查询编辑器在执行期间继续之前提交 SQL。

可以将查询编辑器配置为在“GO”旁边使用不同的批处理标记,但这只会让人们感到困惑。

【讨论】:

  • 它们是 TSQL 的一部分。您也可以在 ADO.NET 中发送包含多个命令的批处理。
  • 我相信你错了。这是关于 GO 命令的 MSDN TSQL 参考页面:msdn.microsoft.com/en-us/library/ms188037.aspx
  • 再想一想,我明白你的意思了。原题中的batch定义是正确的,batch会影响TSQL语句的执行。
【解决方案3】:

来自在线书籍

CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE SCHEMA、CREATE TRIGGER 和 CREATE VIEW 语句不能与批处理中的其他语句组合。 CREATE 语句必须启动批处理。该批处理中的所有其他语句都将被解释为第一个 CREATE 语句定义的一部分。

不能更改表,然后在同一批次中引用新列。

由此您可能推断需要多个批次以确保数据库结构更改在您尝试使用它们之前已经生效。

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2011-05-26
    • 2017-05-01
    • 1970-01-01
    相关资源
    最近更新 更多