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