4

似乎 USE 语句是由 MS SQL Server 2008R2 编译的。

例如,

if(1=0)
begin
   USE MyDB
end

结果将在执行USE MyDB时忽略 IF 语句。

如何改变它以适应条件?

PS 也试过execute sp_executesql N'USE [MyDB]'了,它适用于条件,但它不会改变当前上下文。

4

3 回答 3

2

实际上,在运行时更改数据库的正确方法就是动态 SQL,它在实际执行之前不会被编译或验证。您的示例,失败的代码sp_executesql实际上涉及更改上下文,但问题是更改适用于动态 SQL 批处理,而不适用于调用代码。要实际查看和使用该数据库,必须将更多代码放入动态SQL 块中,并由EXEC/立即执行sp_executesql

USE master ;
EXEC (N'USE tempdb ; PRINT db_name() ;') ;
PRINT db_name() ;

如果您绝对需要进行动态数据库切换,我认为您可以重构脚本以使其仅构建包含要运行的命令的字符串,并且该1=0条件仅在适当的语句之前添加一个适当的USE语句来选择要使用的数据库。

于 2013-08-10T20:20:45.773 回答
1

当您需要有条件的“使用 MyDB”时,我会查看 sqlcmd 和变量。

Use $(DatabaseName) 
GO 

这是我发现获得“动态”使用 MyDatabase 名称的唯一方法。

参考文章:

technet.microsoft.com/en-us/library/ms188714.aspx

于 2013-08-19T19:24:14.757 回答
0

以这种方式尝试使用动态 SQL:

EXEC ('USE [MyDB];')
于 2013-08-10T08:56:32.830 回答