我在尝试将 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,这很容易:
如果需要传参数,没问题:
如果目标是在所选数据库中执行一些静态SQL,也许您应该考虑将该静态 SQL 存储在每个数据库的存储过程中,并像这样动态调用它:
并且希望最终目标不是在 SSMS 中运行所有这些代码,以便 SSMS 现在处于
@db
......如果我明确表示这是不可能的,Daniel 会非常喜欢它,正如@Lothar 的评论也指出的那样。dynamicSQL 实际上并没有与您的代码的其余部分内联地执行,它是一个单独的实体(即使它像内联一样运行
如果您运行代码:
SET @sql = N'Use ' + @db + '; select DB_NAME(); select @@spid'
在您当前的集合中,您会注意到返回的结果表明您已经移动了活动数据库,但您仍在同一连接下运行。如果要更改内联数据库选择,最好的方法是执行以下操作:
它不好也不干净,每个潜在的数据库需要两行,但它会完成工作(不要在动态 SQL 中运行它,否则你仍然会遇到主线程未更改的相同问题)
请注意,尽管在过程/函数中禁止使用 USE 命令
有未记录的 sp_MSforeachdb 过程: