USE DB可能不存在

时间:2013-01-07 16:40:00

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

我有一个带有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

3 个答案:

答案 0 :(得分:3)

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

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

如另一个答案所示,请在所有名称中使用数据库限定符。

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

在我的头顶,您可以完全限定所有引用,以避免USE语句。 我希望有人提出一个需要较少PT的解决方案。

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

SELECT Moo FROM MyTable

使用

SELECT Moo FROM MyDB.MySchema.MyTable