sql-server - 在 SQL 查询中运行 .sql 文件

标签 sql-server tsql

我有一个 SQL 脚本,需要在大约 20 个不同的数据库上运行。

我基本上只需要能够运行一些 SQL,然后让它从磁盘加载并运行一个文件,执行更多 SQL,再次运行相同的脚本,等等。

我希望制作一个基本上如下所示的 SQL 脚本:

use database1
go
exec c:\release.sql
go

use database2
go
exec c:\release.sql
go

use database3
go
exec c:\release.sql
go

- 等等....

我在网上看了一堆,找到了一种在批处理文件中使用 sqlcmd 执行类似操作的方法,但它不起作用,我也不知道如何以这种方式切换数据库。

万分感谢!

最佳答案

您可以将管理工作室切换到 sqlcmd 模式(查询菜单),然后使用 :r script.sql 运行脚本

要在动态生成的数据库列表上执行此操作,您必须执行一些 sqlcmd 技巧:

  • 将输出设置为文件
  • 生成执行命令
  • 将输出设置为标准输出
  • 执行文件
  • 删除临时文件

  • 我假设在这个例子中文件 script.sql 存在于 c:\temp .请注意 GO语句在脚本中很重要,否则 sqlcmd 解析器会混淆。
    :OUT $(TEMP)\db.sql
    declare @script nvarchar(max)
    select @script = isnull(@script, '') 
                   + 'use ' + name + char(13) + char(10) 
                   + ':r c:\temp\script.sql' + char(13) + char(10) 
      from sys.databases
     where name like N'%[_]db'
    print @script
    
    GO
    
    :OUT stdout
    :r $(TEMP)\db.sql
    
    GO
    
    !!del $(TEMP)\db.sql /s /q
    

    关于sql-server - 在 SQL 查询中运行 .sql 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28331468/

    相关文章:

    .net - 我可以每 3 秒轮询一次数据库吗?

    sql-server - 删除然后在数据库中创建约束是否安全

    sql - 在 Access vba 中执行参数化的 T-SQL 存储过程

    c# - 将 SSIS 包转换为 .NET 应用程序?

    sql-server - 有没有办法使用窗口函数来保持最小总数为 0 而不必循环?

    sql - Transact-SQL - 子查询还是左连接?

    mysql - SQL查询: Group Concat Children Elements With Parent

    sql - SQL 2005 中的 TSQL : Query

    sql - 从 MySql 移植到 T-Sql。任何 INET_ATON() 等价物?

    sql-server-2008 - 如何在 sql server 2008 中获得没有约束的表列?