Sql server 在同一脚本中从一个数据库切换到另一个数据库

Sql server 在同一脚本中从一个数据库切换到另一个数据库,sql-server,tsql,Sql Server,Tsql,我想知道如何在同一个脚本中从一个数据库切换到另一个数据库。我有一个脚本,它从SQLServer.BAK文件读取头信息,并将信息加载到测试数据库中。一旦信息出现在临时表(Testdatabase)中,我就运行以下脚本来获取数据库名称 这部分很好用 INSERT INTO @HeaderInfo EXEC('RESTORE HEADERONLY FROM DISK = N''I:\TEST\database.bak'' WITH NOUNLOAD') DECLARE @databasename

我想知道如何在同一个脚本中从一个数据库切换到另一个数据库。我有一个脚本,它从SQLServer
.BAK
文件读取头信息,并将信息加载到测试数据库中。一旦信息出现在临时表(
Test
database)中,我就运行以下脚本来获取数据库名称

这部分很好用

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)
目标是切换到新数据库(
usenewdatabase
),以便脚本的另一部分(
DBCC CHECKDB
)可以运行。此脚本检查数据库的完整性,并将结果保存到临时表中


我做错了什么?

您不能期望
use
语句使用动态SQL以这种方式工作。动态SQL在它自己的上下文中运行,所以一旦它被执行,您就可以返回到原始上下文。这意味着您必须在相同的动态SQL执行中包含SQL语句,例如:

declare @db sysname = 'tempdb';
exec ('use ' + @db + '; dbcc checkdb;')
您也可以为DB对象使用完全限定名称,并在dbcc命令中指定数据库名称,即使使用变量,如中所示:

declare @db sysname = 'tempdb';
dbcc checkdb (@db);

无法执行此操作,因为Exec作用域仅限于动态查询。当exec结束时,上下文将返回到原始状态。但是Exec本身的上下文会发生变化。所以你应该在一个大的动态语句中完成你的事情,比如:

DECLARE @str NVARCHAR(MAX)

SET @str = 'select * from table1
USE DatabaseName
select * from table2'

EXEC (@str)

@用户36578如果答案能够让未来的访问者知道结果,那么您可以随时接受答案。