看来USE语句是由MS SQL Server 2008R2编译的。
例如,
if(1=0)
begin
USE MyDB
end
结果将是执行
USE MyDB
而忽略IF语句。
如何更改为有条件工作?
附注还尝试了
execute sp_executesql N'USE [MyDB]'
,它适用于条件,但它不会改变当前上下文。
当您需要条件“使用 MyDB”时,我会查看 sqlcmd 和变量。
Use $(DatabaseName)
GO
这是我发现获得“动态”使用 MyDatabase 名称的唯一方法。
参考文章:
事实上,在运行时更改数据库的正确方法正是动态 SQL,它在实际执行之前不会被编译或验证。您的示例中涉及
sp_executesql
的失败代码实际上确实更改了上下文,但问题是该更改仅适用于动态 SQL 批处理,而不适用于调用代码。要实际查看和使用该数据库,必须将更多代码放入动态 SQL 块中,并通过 EXEC
/sp_executesql
立即执行:USE master ;
EXEC (N'USE tempdb ; PRINT db_name() ;') ;
PRINT db_name() ;
如果您绝对需要进行动态数据库切换,我认为您可以重构脚本,使其仅构建包含要运行的命令的字符串,并且
1=0
条件仅在前面添加适当的
USE
语句来选择数据库一起工作。
尝试以这种方式使用动态 SQL :