2014-06-19 26 views
0

我正在使用下面的代码将db上下文切换为主并创建过程并设置启动脚本。在运行时切换数据库上下文

BEGIN TRY 
DECLARE @dbName NVARCHAR(100) 
SET @dbName = DB_NAME() 
USE MASTER 
IF NOT EXISTS (
      SELECT name 
      FROM sys.objects 
      WHERE object_id = OBJECT_ID('spSetTrustWorthyOn') 
      ) 
     EXEC (
       'CREATE PROCEDURE spSetTrustWorthyOn 
     AS 
     BEGIN 
      ALTER DATABASE [' + @dbName + '] SET TRUSTWORTHY ON 
     END' 
       ) 

    EXECUTE sp_procoption 'spSetTrustWorthyOn' 
     ,'startup' 
     ,'ON' 
    END TRY 
    BEGIN CATCH 
    END CATCH 
    GO 

现在问题是当我想切换回现有的数据库。我找不到任何方式回到我原来的数据库。

我也不能硬编码数据库,因为这是动态查询,我们有多个数据库。

任何帮助将不胜感激。

感谢

回答

1

代替主数据库USE语句的,有资格的目录视图,并使用EXEC sp_executesql的语句与限定主数据库。这将避免更改外部脚本中的数据库上下文。

DECLARE 
    @dbName sysname = DB_NAME() 
    ,@sql nvarchar(MAX); 

BEGIN TRY 

    IF NOT EXISTS (
     SELECT * 
     FROM master.sys.objects 
     WHERE object_id = OBJECT_ID(N'spSetTrustWorthyOn') 
     ) 
    BEGIN 
     SET @sql = N'CREATE PROCEDURE spSetTrustWorthyOn 
      AS 
      BEGIN 
       ALTER DATABASE ' + QUOTENAME(@dbName) + ' SET TRUSTWORTHY ON; 
      END;'; 
     EXECUTE master..sp_executesql @sql; 
     EXECUTE sp_procoption 
      'spSetTrustWorthyOn' 
      ,'startup' 
      ,'ON'; 
    END; 
END TRY 
BEGIN CATCH 
    THROW; 
END CATCH; 
GO 
+0

感谢您的回复,但商店proc应该是主数据库的一部分。 –

+0

你试过这个脚本吗?由于“EXECUTE master..sp_executesql”语句中的显式数据库限定,它将在master中创建存储过程。执行后数据库上下文将保留在用户数据库中。 –

+0

很酷,我没有看到'EXECUTE master..sp_executesql'这一行。感谢TON,因为我一直在努力完成这项工作。我使用了sp_execute sql这个想法,但我很笨,以至于我可以这样调用。 –

相关问题