【问题标题】:Creating a bat file which executes SQL scripts创建执行 SQL 脚本的 bat 文件
【发布时间】:2012-05-24 23:01:07
【问题描述】:

我有一个文件夹,在每周 sprint 之后都会将一些 MSQL 脚本放入其中。例如,今天将 10 个脚本放入该文件夹中。然后我必须单独打开每个脚本并针对适用的数据库运行它。它需要运行的数据库位于文件的名称中。 例如[2] [CRMdata]UpdateProc.sql

[2] 代表它运行的顺序,所以脚本 [1] 需要在它之前运行。 [CRMdata] 是我必须对其运行的数据库。

这个过程非常烦人,尤其是如果有 50 个脚本要按顺序运行。 我想知道是否有更简单的方法可以做到这一点? 可能是一个 .bat 文件,它读取文件名,并根据脚本编号顺序执行脚本,并针对文件名中指定的数据库执行它。

非常感谢任何帮助。 谢谢。

【问题讨论】:

  • 我假设这是 Windows,因为您说的是“批处理文件”。如果您使用更好的脚本语言,例如通过 Windows 脚本主机或 Powershell 的 VBscript 或 Javascript,您将不会感到沮丧。使用其中之一,做起来或多或少是微不足道的(读取文件名,解析它们并构建你的命令)。
  • 我肯定会为此使用 VBScript。使用 FileSystemObject 获取脚本列表。
  • 什么是MSQLMS SQLMySQL?

标签: sql batch-file automation


【解决方案1】:

首先,当您需要运行事物时,请考虑使用 SQL Server Job Agent。这是安排简单事情的好方法。

对于这样的任务,我建议将 PowerShell 与“sqlcmd”结合使用。该命令实际上是您问题的答案,因为它将从命令行运行脚本。

但是,更进一步。安排每周运行一次的作业(或您希望它运行的任何时间)。让它包含一个步骤,一个 PowerShell 脚本。然后,这可以遍历目录中的所有脚本,从名称中提取文件名,并使用 sqlcmd 运行脚本。在此过程中,还将您正在执行的操作记录在表格中,以便您发现错误。

【讨论】:

    【解决方案2】:

    我对使用 MSQL 执行 SQL 一无所知。您必须弄清楚如何使用为 MSQL 提供的任何命令行实用程序针对正确的数据库运行每个脚本。

    我可以帮助您创建一个批处理文件,该批处理文件将按照正确的顺序对 SQL 文件进行排序,并解析出数据库的名称。

    如果序列号为零前缀以保持恒定宽度,则批处理作业会容易得多。我假设重命名文件是可以的,所以这就是这个解决方案的作用。

    我还假设您要处理的文件永远不会超过 999 个。可以轻松修改代码以处理更多内容。

    如果任何文件名包含! 字符,则必须进行一些更改,因为延迟扩展会破坏 FOR 变量的扩展。但这是一个不太可能出现的问题。

    @echo off
    setlocal enableDelayedExpansion
    
    :: Change the definition to point to the folder that contains the scripts
    set "folder=sqlCodeFolder"
    
    :: The mask will only match the pattern that you indicated in your question
    set "mask=[*] [*]*.sql"
    
    :: Rename the .sql files so that the sequence numbers are zero prefixed
    :: to width of 3. This enables the default alpha sort of the directory to be
    :: in the proper sequence
    for /f "tokens=1* delims=[]" %%A in ('dir /b "%folder%\%mask%"') do (
      set seq=00%%A
      ren "%folder%\[%%A]%%B" "[!seq:~-3!]%%B"
    )
    
    ::Process the renamed files in order
    for %%F in ("%folder%\%mask%") do (
      for /f "tokens=2 delims=[] " %%D in ("%%~nF") do (
        rem %%F contains the full path to the sql file
        rem %%D contains the name of the database, without enclosing []
        rem Replace the echo line below with the proper command to run your script
        echo run %%F against database [%%D]
      )
    )
    

    【讨论】:

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