Sql-Server

如何使用 TSQL 動態更改數據庫

  • September 22, 2021

我在嘗試將 SSMS 的上下文動態更改為動態 SQL 中指定的數據庫時遇到問題:

EXEC sys.sp_executesql N'USE db1 ' ;

它成功執行,但是 SSMS 的數據庫上下文沒有改變。

我已經嘗試對上面的內容進行輕微修改,如下所示

DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sql

再次,它成功執行,但數據庫沒有改變。

我重複一遍,SSMS 不會切換到您在動態 SQL 中執行的 USE 命令的上下文。

如果最終目標是在所選數據庫中執行其他一些動態 SQL,這很容易:

DECLARE @db sysname = N'db1';

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
       @sql  nvarchar(max) = N'SELECT DB_NAME();';

EXEC @exec @sql;

如果需要傳參數,沒問題:

DECLARE @db sysname = N'db1', @i int = 1;

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
       @sql  nvarchar(max) = N'SELECT DB_NAME(), @i;';

EXEC @exec @sql, N'@i int', @i;

如果目標是在所選數據庫中執行一些靜態SQL,也許您應該考慮將該靜態 SQL 儲存在每個數據庫的儲存過程中,並像這樣動態呼叫它:

DECLARE @db sysname = N'db1';

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
       @sql  nvarchar(max) = N'EXEC dbo.procedurename;';

EXEC @exec @sql;

並且希望最終目標不是在 SSMS 中執行所有這些程式碼,以使 SSMS 現在處於@db…的上下文中,如果我明確表示這是不可能的,Daniel 會非常喜歡它,正如@Lothar 的評論中所說的那樣。

引用自:https://dba.stackexchange.com/questions/185018