条件下的T-SQL USE语句

问题描述 投票:0回答:3

看来USE语句是由MS SQL Server 2008R2编译的。

例如,

if(1=0)
begin
   USE MyDB
end

结果将是执行

USE MyDB
而忽略IF语句。

如何更改为有条件工作?

附注还尝试了

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

sql-server sql-server-2008 stored-procedures
3个回答
3
投票

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

Use $(DatabaseName) 
GO 

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

参考文章:

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

https://learn.microsoft.com/en-us/sql/tools/sqlcmd/sqlcmd-use-scripting-variables?view=sql-server-ver16


2
投票

事实上,在运行时更改数据库的正确方法正是动态 SQL,它在实际执行之前不会被编译或验证。您的示例中涉及

sp_executesql
的失败代码实际上确实更改了上下文,但问题是该更改仅适用于动态 SQL 批处理,而不适用于调用代码。要实际查看和使用该数据库,必须将更多代码放入动态 SQL 块中,并通过 EXEC/sp_executesql立即执行:

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

如果您绝对需要进行动态数据库切换,我认为您可以重构脚本,使其仅构建包含要运行的命令的字符串,并且

1=0
 条件仅在前面添加适当的 
USE

语句来选择数据库一起工作。

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


-1
投票

© www.soinside.com 2019 - 2024. All rights reserved.