我有许多数据库,我应该在其上运行相同的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文件的当前数据库。
答案 0 :(得分:2)
问题是您在执行sp_executeSQL的动态sql中发出USE <Database>
命令。新的“数据库上下文”仅在该会话期间保持选中状态(只要sp_executeSQL正在运行)。所以:
您需要做的是将USE
语句嵌入到check_db.sql
中正在执行的SQL中。那,或让SQLCMD为您设置数据库,如果可以作为sqlcmd“内联”命令完成。