如何使用 TSQL 动态更改数据库

Maz*_*har 14 sql-server dynamic-sql t-sql sql-server-2014

我在尝试将 SSMS 的上下文动态更改为动态 SQL 中指定的数据库时遇到问题:

EXEC sys.sp_executesql N'USE db1 ' ;
Run Code Online (Sandbox Code Playgroud)

它成功执行,但 SSMS 的数据库上下文不会改变。

我试过对上面的稍作修改

DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)

同样,它成功执行,但数据库没有改变。

Aar*_*and 16

SSMS不会,我再说一遍,不会切换到一个USE命令您运行动态SQL语句的上下文。

如果最终目标是在所选数据库中执行其他一些动态 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;
Run Code Online (Sandbox Code Playgroud)

如果需要传递参数,没问题:

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;
Run Code Online (Sandbox Code Playgroud)

如果目标是在所选数据库中执行一些静态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;
Run Code Online (Sandbox Code Playgroud)

希望最终目标不是在 SSMS 中运行所有这些代码,只是为了让 SSMS 现在处于...的上下文中@db,如果我明确声明这是不可能的,Daniel 会非常喜欢它,正如@Lothar 的评论也指出的那样。