我想知道如何在同一个脚本中从一个数据库切换到另一个数据库。我有一个脚本从SQL Server .BAK
文件中读取标头信息,并将信息加载到测试数据库中。一旦信息在临时表(Test
数据库)中,我运行以下脚本来获取数据库名称。
这部分工作正常。
INSERT INTO @HeaderInfo EXEC('RESTORE HEADERONLY
FROM DISK = N''I:\TEST\database.bak''
WITH NOUNLOAD')
DECLARE @databasename varchar(128);
SET @databasename = (SELECT DatabaseName FROM @HeaderInfo);
问题是当我尝试运行以下脚本时没有任何反应。从未选择新数据库,脚本仍在测试数据库中。
EXEC ('USE '+ @databasename)
目标是切换到新数据库(USE NewDatabase
),以便我的脚本的其他部分(DBCC CHECKDB
)可以运行。此脚本检查数据库的完整性并将结果保存到临时表。
我做错了什么?
答案 0 :(得分:1)
使用动态SQL不能指望use
语句以这种方式工作。动态SQL在其自己的上下文中运行,因此只要它已执行,您就会回到原始上下文。这意味着您必须在同一动态SQL执行中包含SQL语句,例如:
declare @db sysname = 'tempdb';
exec ('use ' + @db + '; dbcc checkdb;')
您也可以为数据库对象使用完全限定名称,并在dbcc命令中指定数据库名称,即使使用变量也是如此:
declare @db sysname = 'tempdb';
dbcc checkdb (@db);
答案 1 :(得分:0)
您无法执行此操作,因为Exec范围仅限于动态查询。当exec结束时,context返回到原始状态。但是Exec本身的上下文发生了变化。所以你应该在一个大的动态陈述中做你的事情,如:
DECLARE @str NVARCHAR(MAX)
SET @str = 'select * from table1
USE DatabaseName
select * from table2'
EXEC (@str)