【问题标题】:USE DB that may not exist使用可能不存在的数据库
【发布时间】:2012-12-21 10:20:54
【问题描述】:

我有一个包含USE DATABASE 语句的脚本。 如果数据库存在,脚本运行得非常好。如果它不存在,它会失败并显示“数据库不存在”消息,这很有意义。

现在,我不会失败,所以我添加了一个检查来选择数据库是否存在于 sys.databases 上(为了简单起见,我将在这里用IF 1=2 检查来表示),所以,如果DB 存在(1=1),然后运行“use”语句。

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

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

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

【问题讨论】:

  • 这个脚本@Diego 有多大?完全限定您的表名可能更容易,并将整个脚本包装在 if exists... 中,但这完全取决于如果数据库不存在存在时您想要做什么。
  • 另外,this question 可能是一个潜在的重复项。

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


【解决方案1】:

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

因此,use 在不存在的数据库上会产生编译时错误。我不知道绕过编译时错误的方法。

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

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

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

【讨论】:

  • 这实际上是个好主意,但问题是无论数据库是否存在,我仍然需要“使用”它,所以脚本仍然会失败
【解决方案2】:

这个怎么样?也许你可以这样检查。

if db_id('dbname') is not null
 -- do stuff

或者试试这个:

if not exists(select * from sys.databases where name = 'dbname')
    -- do stuff

所以对于表:

if object_id('objectname', 'somename') is not null 

sp_msforeachdb ‘select * from ?.sys.tables’

Reference

【讨论】:

  • 我最终使用了你的想法 IF (db_id('$(dbname)') IS NOT NULL) BEGIN (它是一个 vsql 脚本)。谢谢!
【解决方案3】:

在我的脑海中,您可以完全限定所有引用以避免USE 声明。 我希望有人想出一个需要更少 PT 的解决方案。

在检查数据库是否存在之后,而不是

SELECT Moo FROM MyTable

使用

SELECT Moo FROM MyDB.MySchema.MyTable

【讨论】:

  • 很多语句不接受 3 个部分名称。比如创建过程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2012-11-10
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多