在目录中运行所有SQL文件


117

我必须运行多个.sql文件,以应用其他开发人员在SQL Server 2005数据库上所做的更改。这些文件是根据以下模式命名的:

0001 - abc.sql
0002 - abcef.sql
0003 - abc.sql
...

有没有办法一次性运行所有这些程序?

Answers:


143

使用以下命令创建.BAT文件:

for %%G in (*.sql) do sqlcmd /S servername /d databaseName -E -i"%%G"
pause

如果您需要提供用户名和密码

for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P 
password -i"%%G"

请注意,提供用户名/密码时不需要“ -E”

将此.BAT文件放置在您希望从中执行.SQL文件的目录中,双击.BAT文件即可完成操作!


2
当我执行批处理文件时,出现一些身份验证问题,提示“登录失败。登录来自不受信任的域,不能与Windows身份验证一起使用。”。有没有办法提供用户名和密码,例如服务器名和数据库?
Sanjay Maharjan

11
@SanjayMaharjan使用-U表示用户,使用-P表示密码,例如:for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P "password" -i"%%G"
Rickedb 2016年

我如何使用-o将​​输出放置到单独的文件中?每当我像-o temp.txt这样使用时,此temp.txt都会被覆盖。我想以相同的sql文件名获取输出文件。
凯文(Kevin)

@vijeth:干得好。我当时想一一做一些200个sql文件。节省了大量时间
Uthistran Selvaraj

@Vijeth谢谢。我只是为自己修改:REM REM开发环境而已!!(* .sql)中%% G的REM暂停执行sqlcmd / S“ 192.168.10.139 \ SQLEXPRESS” / d“ TESTDEV_DB” -U“ atiour” -P“ atiour” -i“ %% G”暂停REM REM所有脚本成功运行REM
atik sarker'ul

71

使用FOR。在命令提示符下:

c:\>for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f"

2
我必须在最后一个“%f”周围加上引号,以使其与包含空格的脚本一起使用
Steve Wright

有关可用于批处理文件的版本,请参见此答案
伊恩·坎普

我还必须添加其他一些参数(例如,/ I以启用带引号的标识符)
Pavel K

我喜欢这个-但是有什么方法可以将结果输出到文件中吗?这样我就可以轻松看到任何例外情况?我只是在136个.sql文件上尝试了此命令,所以我失去了大多数文件的可见性
丰富的

2
@Rich要将输出重定向到文件,请使用以下命令:for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f" >> sql.log 2>&1) 您可以在此处
danijelk

26
  1. 在SQL Management Studio中,打开一个新查询,然后键入所有文件,如下所示

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  2. 转到SQL Management Studio上的“查询”菜单,并确保已启用“ SQLCMD模式”
  3. 点击SQLCMD模式;文件将以灰色选择,如下所示

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  4. 现在执行

3
如果我有数百个文件,这真的很乏味。
devlin康乃馨

1
@devlincarnate:大概您可以想到一种自动执行步骤1的方法,例如“ dir / B * .sql> list.txt”,然后对list.txt文件进行一些处理。
杰夫·罗

在较新版本的Windows中,@ devlincarnate可以按住Shift键,右键单击一个文件,然后选择“复制为路径”。从那里,按CTRL + V进入SSMS窗口。它也适用于多个文件。在资源管理器中选择两个或多个文件,右键单击任何突出显示的文件,然后选择“复制为路径”。在SSMS中重复步骤。文件路径用双引号引起来,您可能希望也可能不想在带有查找/替换的SSMS中删除它们。
戴夫·梅森

21

通过单击管理工作室中的“查询”>“ SQLCMD模式”选项,确保已启用SQLCMD。

  1. 假设script1.sql,script2.sql,script3.sql,script4.sql一个文件夹中有四个.sql文件()c:\scripts

  2. 使用以下命令创建一个主脚本文件(Main.sql):

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
    :r c:\Scripts\script4.sql

    将Main.sql保存在c:\ scripts自身中。

  3. 创建一个ExecuteScripts.bat具有以下名称的批处理文件:

    SQLCMD -E -d<YourDatabaseName> -ic:\Scripts\Main.sql
    PAUSE

    请记住<YourDatabaseName>用要执行脚本的数据库替换。例如,如果数据库为“ Employee”,则命令如下:

    SQLCMD -E -dEmployee -ic:\Scripts\Main.sql
    PAUSE
  4. 双击执行批处理文件。


我刚刚编辑了答案。另外,还需要确保脚本文件存在于指定的路径中。
Ashish Gupta

这种方法的好处是,发现任何错误,然后停止执行其他脚本:)类似于-b示例:SQLCMD -b -i "file 1.sql","file 2.sql"
Jaider 2014年

这种方法的坏处是必须维护要运行的所有SQL文件的列表。
弗朗西斯科·德·安科尼亚'17

10

您可以使用ApexSQL Propagate。它是一个免费工具,可以在多个数据库上执行多个脚本。您可以根据需要选择任意数量的脚本,并针对一个或多个数据库(甚至多个服务器)执行它们。您可以创建脚本列表并将其保存,然后每次要以创建的顺序执行相同的脚本时都选择该列表(也可以添加多个脚本列表):

选择脚本

选择脚本和数据库后,它们将显示在主窗口中,您要做的就是单击“执行”按钮,所有脚本将按照给定的顺序在所选数据库上执行:

脚本执行


8

一般查询

将以下行保存在记事本中,名称为batch.bat, 并将其放置在所有脚本文件所在的文件夹中

 for %%G in (*.sql) do sqlcmd /S servername /d databasename  -i"%%G"
    pause

对于(* .sql)中的%% G,请执行sqlcmd / S NFGDDD23432 / d EMPLYEEDB -i“ %% G”暂停

有时如果您登录失败,请使用下面的代码以及用户名密码

for %%G in (*.sql) do sqlcmd /S SERVERNAME /d DBNAME -U USERNAME -P PASSWORD -i"%%G"
pause

对于(* .sql)中的%% G,请执行sqlcmd / S NE8148server / d EMPLYEEDB -U 斯科特 -P Tiger -i“ %% G”暂停

在脚本文件所在的文件夹内创建bat文件后,只需单击bat文件,脚本即会执行


5

我用C#编写了一个开源实用程序,该实用程序允许您拖放许多SQL文件并开始在数据库上运行它们。

该实用程序具有以下功能:

  • 拖放脚本文件
  • 运行脚本文件目录
  • 执行期间的SQL脚本输出消息
  • 通过或失败的脚本显示为绿色和红色(运行时为黄色)
  • 停止错误选项
  • 错误选项时打开脚本
  • 运行报告并为每个脚本花费时间
  • 总持续时间
  • 测试数据库连接
  • 异步
  • .Net 4并通过SQL 2008测试
  • 单个exe文件
  • 随时终止连接

3

我发现最简单的方法包括以下步骤(唯一的要求是在Win7 +中):

  • 在资源管理器中打开文件夹
  • 选择所有脚本文件
  • 按Shift
  • 右键单击所选内容,然后选择“复制为路径”
  • 转到SQL Server Management Studio
  • 创建一个新查询
  • 查询菜单,“ SQLCMD模式”
  • 粘贴列表,然后按Ctrl + H,将'“ C:\”(或任何驱动器号)替换为':r“ C:”(即在行首添加':r')
  • 运行查询

听起来很长,但是实际上是非常快的..(听起来就像我描述了最小的步骤一样)



1
@echo off
cd C:\Program Files (x86)\MySQL\MySQL Workbench 6.0 CE

for %%a in (D:\abc\*.sql) do (
echo %%a
mysql --host=ip --port=3306 --user=uid--password=ped < %%a
)

步骤1:将上述行复制到记事本中,另存为蝙蝠。

第二步:在d驱动器的abc文件夹中,在所有sql文件中在sql server中执行查询。

第三步:输入您的IP,用户名和密码。


这个问题与MSSQL有关,与MySQL有关。
肖恩

0

您可以创建一个调用所有其他脚本的脚本。

将以下内容放入批处理文件中:

@echo off
echo.>"%~dp0all.sql"
for %%i in ("%~dp0"*.sql) do echo @"%%~fi" >> "%~dp0all.sql"

当您运行该批处理文件时,它将all.sql在该批处理文件所在的目录中创建一个新脚本。它将查找带有扩展名的所有文件.sql在批处理文件所在的目录中的文件。

然后,您可以使用来运行所有脚本sqlplus user/pwd @all.sql(或sqlplus在创建all.sql脚本后扩展批处理文件以进行调用)


0

要在同一目录上执行每个SQLfile,请使用以下命令:

ls | awk '{print "@"$0}' > all.sql

该命令将创建一个单独的SQL文件,目录中每个SQL文件的名称均以“ @”结尾。

all.sql创建完后,只需all.sql使用SQLPlus 执行即可,这将执行中的每个sql文件all.sql


0

如果可以使用Interactive SQL:

1-使用以下代码创建.BAT文件:

@ECHO OFF ECHO
for %%G in (*.sql) do dbisql -c "uid=dba;pwd=XXXXXXXX;ServerName=INSERT-DB-NAME-HERE" %%G
pause

2-更改密码和服务器名称。

3-将.BAT文件放入包含.SQL文件的文件夹中并运行它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.