【问题标题】:Run all SQL files in a directory运行目录中的所有 SQL 文件
【发布时间】:2011-02-04 17:25:45
【问题描述】:

我必须运行一些 .sql 文件,以便将其他开发人员对 SQL Server 2005 数据库所做的更改应用到这些文件中。 这些文件根据以下模式命名:

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

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

【问题讨论】:

    标签: sql sql-server batch-processing


    【解决方案1】:

    使用以下命令创建一个 .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 文件即可!

    【讨论】:

    • 当我执行批处理文件时,出现一些身份验证问题,提示“登录失败。登录来自不受信任的域,不能用于 Windows 身份验证。”。有没有办法像服务器名称和数据库一样提供用户名和密码?
    • @SanjayMaharjan 使用 -U 作为用户名,使用 -P 作为密码,例如:for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P "password" -i"%%G"
    • 如何使用 -o 将输出放到单独的文件中?每当我使用 like -o temp.txt 时,这个 temp.txt 就会被覆盖。我想将输出文件作为相同的 sql 文件名。
    • @vijeth:干得好。我正在考虑一个一个地做一些 200 个 sql 文件。节省了很多时间
    • @Vijeth 谢谢。我只是为自己修改:仅 REM REM 开发环境! REM pause for %%G in (*.sql) do sqlcmd /S "192.168.10.139\SQLEXPRESS" /d "TESTDEV_DB" -U "atiour" -P "atiour" -i"%%G" pause REM REM All Script REM 成功运行
    【解决方案2】:

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

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

    【讨论】:

    • 我必须在最后一个 "%f" 周围添加引号,以使其适用于包含空格的脚本
    • 有关批处理文件的版本,请参阅this answer
    • 我还必须添加一些其他参数(例如 /I 以启用带引号的标识符)
    • 我喜欢这个 - 但是有什么方法可以将结果输出到文件中?所以我可以很容易地看到任何异常?我刚刚在 136 个 .sql 文件上尝试了这个命令,所以我已经失去了大多数文件的可见性
    • @Rich 要将输出重定向到文件,请使用以下命令:for %f in (*.sql) do sqlcmd /S &lt;servername&gt; /d &lt;dbname&gt; /E /i "%f" &gt;&gt; sql.log 2&gt;&amp;1) 您可以阅读有关输出重定向的更多信息here
    【解决方案3】:
    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. 现在执行

    【讨论】:

    • 如果我有数百个文件,这真的很乏味。
    • @devlincarnate:大概你可以想出一种方法来自动化步骤 1。比如“dir /B *.sql > list.txt”,然后稍微按摩一下那个 list.txt 文件。
    • @devlincarnate 在较新版本的 Windows 中,您可以按住 Shift 键,右键单击文件,然后选择“复制为路径”。从那里,CTRL+V 进入 SSMS 窗口。它也适用于多个文件。在资源管理器中选择两个或多个文件,右键单击任何突出显示的文件,然后选择“复制为路径”。在 SSMS 中重复步骤。文件路径用双引号括起来,您可能希望或不希望在 SSMS 中使用 Find/Replace 将其删除。
    【解决方案4】:

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

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

    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
      

      请记住将&lt;YourDatabaseName&gt; 替换为您要执行脚本的数据库。例如,如果数据库是“Employee”,则命令如下:

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

    【讨论】:

    • 我刚刚编辑了我的答案。另外,需要确保脚本文件存在于指定路径中。
    • 这种方法的好处是发现任何错误然后停止执行进一步的脚本:) 类似于-b 示例:SQLCMD -b -i "file 1.sql","file 2.sql"
    • 这种方法的坏处是必须维护要运行的所有 SQL 文件的列表。
    【解决方案5】:

    我找到的最简单的方法包括以下步骤(唯一的要求是它必须在 Win7+ 中):

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

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

    【讨论】:

    • 这是一种非常快的方法!
    • 这是一种快速简便的方法。好提示!但我必须在替换项目符号中删除或添加“\”。
    • 这是一个救生员..
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

      一般查询

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

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

      示例

      for %%G in (*.sql) do sqlcmd /S NFGDDD23432 /d EMPLYEEDB -i"%%G" 暂停

      如果您有时登录失败,请使用以下代码与 usernamepassword

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

      for %%G in (*.sql) do sqlcmd /S NE8148server /d EMPLYEEDB -U Scott -P 老虎 -i"%%G" 暂停

      在您的脚本文件所在的文件夹中创建 bat 文件后,只需单击 bat 文件,您的脚本就会被执行

      【讨论】:

        【解决方案8】:

        我用 C# 编写了an open source utility,它允许您拖放许多 SQL 文件并开始针对数据库运行它们。

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

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

        【讨论】:

          【解决方案9】:

          据我所知,您可以使用 osql 或 sqlcmd 命令来执行多个 sql 文件。缺点是您必须为这两个命令创建一个脚本。

          Using SQLCMD to Execute Multiple SQL Server Scripts

          OSQL(这是用于 sql server 2000)

          http://msdn.microsoft.com/en-us/library/aa213087(v=SQL.80).aspx

          【讨论】:

            【解决方案10】:
            @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
            )
            

            Step1:以上行复制到记事本保存为bat。

            step2:在d盘abc文件夹中所有Sql文件中在sql server中执行查询。

            第三步:提供你的 ip、用户名和密码。

            【讨论】:

            • 这个问题与 MSSQL 相关,而不是 MySQL。
            【解决方案11】:

            我知道这个问题更侧重于 SQL Server。我有同样的问题,但对于 PostgreSQL。该解决方案非常符合我的需要,所以我想我会将我得到的东西分享给任何需要它的人:

            for %f in (*.sql) do psql -U [username] -d [database name] --command="\i %f";
            

            我从包含我所有的 sql 脚本的文件夹中运行它。

            为了避免被提示输入密码,我不得不添加

            *:*:*:[user]:[password]
            

            到我的 pgpass.conf 文件中

            %APPDATA%\Roaming\postgresql\ 
            

            Windows 上的文件夹。我必须自己创建文件。

            【讨论】:

              【解决方案12】:

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

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

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

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

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

              【讨论】:

                【解决方案13】:

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

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

                此命令将创建一个单独的 SQL 文件,目录中的每个 SQL 文件的名称都附加“@”。

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

                【讨论】:

                  【解决方案14】:

                  如果您可以使用 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 文件的文件夹中并运行它。

                  【讨论】:

                    猜你喜欢
                    • 2016-08-12
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-11-21
                    • 2023-01-04
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-08-20
                    • 2021-02-19
                    相关资源
                    最近更新 更多