sql - 使用可能不存在的数据库

标签 sql sql-server sql-server-2008-r2

我有一个包含 USE DATABASE 语句的脚本。 如果数据库存在,该脚本运行得很好。如果它不存在,则会失败并显示消息“数据库不存在”,这是完全有道理的。

现在,我不想让它失败,所以我添加了一个检查来选择数据库是否存在于 sys.databases 上(为了方便起见,我将在此处用 IF 1=2 检查来表示它)简单起见),因此,如果数据库存在(1=1),则运行“use”语句。

令我惊讶的是,脚本不断失败。所以我尝试添加一个 TRY CATCH block 。相同的结果。 似乎 use 语句是在其他任何事情之前进行评估的,这很烦人,因为现在我的脚本可能会中断。

所以我的问题是:如何在可能不存在的数据库的脚本上使用 use 语句?

BEGIN TRY
   IF (1=1) BEGIN --if DB exists
    USE DB_THAT_MAY_NOT_EXIST
   END 
END TRY
BEGIN CATCH
END CATCH

最佳答案

我不相信你能做你想做的事。 documentation指定 use 在编译时和执行时执行。

因此,在不存在的数据库上使用将会产生编译时错误。我不知道有什么方法可以绕过编译时错误。

正如另一个答案所建议的,在所有名称中使用数据库限定符。

您还可以检查数据库是否存在,而无需切换到它。这是一种方法:

begin try
    exec('use dum');
    print 'database exists'
end try
begin catch
    print 'database does not exist'
end catch

关于sql - 使用可能不存在的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14200166/

相关文章:

sql - 使用额外的(不同的)过滤器聚合列

sql - 从一个表中删除,除非在另一表中引用了行

mysql - 有没有办法优化这个查询?

sql - 使用DISTINCT和LIMIT的子查询

sql - 自定义处理以在 SQL 中将行转换为列

sql - sql server 2008 r2 中的数字(18, 0) 是什么

sql-server - 存储过程中查询的不同执行计数

sql-server - 数据库中所有用户定义函数的 SQL 列表

sql-server - 集成到 VNET 后无法连接到 Azure Function App

sql-server - 不同的架构会在从一个或多个分片检索数据时产生错误。收到的底层错误消息是 : Invalid object name