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

时间:2015-01-28 14:33:41

标签: sql-server tsql

我想知道如何在同一个脚本中从一个数据库切换到另一个数据库。我有一个脚本从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)可以运行。此脚本检查数据库的完整性并将结果保存到临时表。

我做错了什么?

2 个答案:

答案 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)