使用多种语句类型自动化 SQL 脚本

Posted

技术标签:

【中文标题】使用多种语句类型自动化 SQL 脚本【英文标题】:Automate SQL Script with Multiple Statement Types 【发布时间】:2017-05-25 14:28:56 【问题描述】:

我有一个 SQL 脚本,当我逐行浏览它时,它的工作方式完全符合我的要求。起初,这是一个可行的选择,但随着时间的推移脚本变得越来越大,现在单步执行它很糟糕。

我尝试在 Visual Studio 中将脚本作为 SSIS 包的一部分运行,但这给了我奇怪的结果。

我有一种感觉,这是因为我在脚本中使用了混合语言,(即多个 UPDATE、ALTER、SELECT INTO、语句)... 有没有办法自动化这个脚本,让它逐行运行就好像我在踩它一样?

善良。谢谢!

【问题讨论】:

您需要先提交 DDL 更改,然后才能进入下一个块。我认为 SQL Server 使用 GO。 ***.com/questions/1432757/… 可能会有所帮助。 GO 执行上一个“GO”中的所有语句,因此如果您正在对 DDL 进行更改,则可以在下一系列事务之前进行更新,从而使更改生效。 这是为了调试目的吗?为什么不将脚本拆分成多个包/多个存储过程? Sure More on GO:这里:docs.microsoft.com/en-us/sql/t-sql/language-elements/… 请小心,因为如果您执行 go 两次而没有脚本更改,我相信它会运行 TSQL 语句两次,如果您将 1 添加到一些值你最终可能会加 2! 我不相信你需要第一个 Go;我一般会先做 DDL 然后再去,然后做数据更新,这样我的 go 就更少了。 我不太确定 GO 是唯一的解决方案。我认为您还需要用分号终止每个单独的查询。 【参考方案1】:

一般来说。您只需要在每条语句后加一个分号,这与语句类型无关。仅当您想将其分成批次时才需要“Go”(尽管如果您将代码传递给其他东西,即 ADO.NET 命令对象,它可能不起作用)。如果您希望代码在“开始”之前无论代码成功还是失败都继续运行,这将很有帮助。如果您希望代码的延续依赖于前面的代码,只需确保以“;”结束每个语句

【讨论】:

谢谢你。坏习惯如何成为大规模问题的一个很好的例子。知道为什么要花这么长时间吗?手动单步执行脚本并没有花费我 2 个小时... 还是没有运气。部分脚本成功运行,但许多 UPDATE 语句从未发生,导致列没有数据。 您是否尝试过将其设置为 SSIS 作业,每个语句都有一个 SQL 脚本任务?或者您可以在数据流任务中设置它?这两种方法都可以让您更清楚地了解您遇到问题的地方。尝试运行后,查看输出并查找任何错误或警告消息。 奥斯汀想通了。分号实际上解决了这个问题,我只是有这么大的脚本,以至于我第一次错过了几个地方。再次感谢您的帮助。对我来说,下一步是弄清楚如何安排自动提取数据和转换脚本的 SSIS 作业,以便每天晚上在我睡觉时运行。 太棒了!我一直这样做。您可以在数据流任务中设置此类内容,也可以将整个脚本放在 SQL 脚本任务中。我更喜欢使用数据流任务,因为您可以跟踪每个转换之间的行。

以上是关于使用多种语句类型自动化 SQL 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本中执行sql语句操作

postgresql自动导出SQL语句查出的数据

如何在匿名 PL/SQL 块中自动显示所有 SQL 语句的输出

sql server编写archive通用模板脚本实现自动分批删除数据

使用sql语句创建修改SQL Server标识列(即自动增长列)

SQL Server 2008怎么自动备份数据库