我有一组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的解决方案,为了每个人的利益,这是如何实现的。
@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
CreateProcs DBServerName Database1
CreateProcs DBServerName Database2
CreateProcs DBServerName Database3
希望这有帮助。
答案 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