1

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

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

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

任何帮助深表感谢。谢谢。

4

2 回答 2

0

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

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

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

于 2012-05-24T13:09:49.390 回答
0

我对使用 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]
  )
)
于 2012-05-24T15:01:07.383 回答