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