循环遍历数据库列表并运行SQL文件

时间:2013-11-26 14:58:26

标签: sql-server-2008-r2 sqlcmd

我有许多数据库,我应该在其上运行相同的SQL文件。可以在另一个数据库的表中找到数据库名称。我想知道我是否可以以某种方式自动化,以避免手动更改数据库和运行脚本。我正在尝试使以下脚本工作(在sqlcmd模式下):

:On Error Exit
declare @statement nvarchar(MAX), @dbname nvarchar(255)

declare NameList cursor for
select database_name  from databases where type ='s'
OPEN NameList
FETCH NEXT FROM NameList 
INTO @dbname
WHILE @@FETCH_STATUS = 0
 BEGIN
  SET @statement = N'USE '+@dbname+N'
  GO'

  EXEC dbo.sp_executesql @statement

  :r C:\temp\check_db.sql
  GO
  FETCH NEXT FROM NameList INTO @dbname
END
CLOSE NameList
DEALLOCATE NameList

我们的想法是浏览数据库列表并使用USE <DB>语句将当前数据库更改为从列表中获取的数据库,然后从SQL文件运行该脚本。

我收到错误Incorrect syntax near <some point in SQL file>.指向SQL文件中的一行,因此我得出结论USE <DB>没有更改SQL文件的当前数据库。

1 个答案:

答案 0 :(得分:2)

问题是您在执行sp_executeSQL的动态sql中发出USE <Database>命令。新的“数据库上下文”仅在该会话期间保持选中状态(只要sp_executeSQL正在运行)。所以:

  • 您从初始数据库(“A”)开始
  • 您执行动态SQL
  • 当它正在运行时,数据库上下文切换到目标数据库ase(“B”)
  • 动态SQL完成
  • 上下文将恢复为调用会话(“A”)
  • 的上下文

您需要做的是将USE语句嵌入到check_db.sql中正在执行的SQL中。那,或让SQLCMD为您设置数据库,如果可以作为sqlcmd“内联”命令完成。