将T-SQL过程发布到多个数据库

时间:2014-06-02 23:39:10

标签: sql-server tsql stored-procedures

我有一组SQL Server批处理程序,所有这些程序都需要安装并定期执行,它们都具有以下结构:

USE

IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'')并输入(N' P',N' PC'))   DROP PROCEDURE [dbo]。[] GO

创建程序

AS

BEGIN

< ...程序正文...>

END

我正在寻找一种方法来运行每个.sql文件一次,以便在所有数据库上安装它。程序很长,因此使用单独的USE语句多次重复它们是不实际的,也很难维护。

我尝试在sys.databases上使用带有USE @DB_Name的游标但是没有用,因为USE不接受参数,并且因为CREATE PROCEDURE需要是块中的第一个语句。

非常感谢任何帮助或指示。


所以我最终使用了WrathOfKhan的解决方案,为了每个人的利益,这是如何实现的。

  1. 创建了空白results.log文件。
  2. 创建了CreatProcs.Bat文件,如下所示:
  3. 
    @echo off

    echo Session start %date% %time% echo Session start %date% %time% >> results.log

    REM The first file contains the DDL to create related tables, etc. REM all the subsequent files are my procs. U and P switches are omitted, REM since this file runs from a permissioned account.

    sqlcmd -b -S %1 -d %2 -i file1.sql >> results.log sqlcmd -b -S %1 -d %2 -i file2.sql >> results.log ...

    echo Session end %date% %time% echo Session end %date% %time% >> results.log

    1. 创建了PublishAll.bat
    2. 
      CreateProcs DBServerName Database1
      CreateProcs DBServerName Database2
      CreateProcs DBServerName Database3
      

      希望这有帮助。

1 个答案:

答案 0 :(得分:3)

只需编写没有USE的脚本,然后使用SqlCmd运行它并使用-d标志指定数据库。 (http://msdn.microsoft.com/en-us/library/ms162773.aspx

sqlcmd -U username -P password -d db1 -i myscript.sql
sqlcmd -U username -P password -d db2 -i myscript.sql
sqlcmd -U username -P password -d db3 -i myscript.sql
sqlcmd -U username -P password -d db4 -i myscript.sql