Sql-Server
如何使用 TSQL 動態更改數據庫
我在嘗試將 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 的評論中所說的那樣。