6

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

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

令我惊讶的是,脚本一直失败。所以我尝试添加一个 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
4

3 回答 3

5

我不相信你可以做你想做的事。文档指定在编译时和执行时use执行。

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

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

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

begin try
    exec('use dum');
    print 'database exists'
end try
begin catch
    print 'database does not exist'
end catch
于 2013-01-07T16:51:59.127 回答
3

这个怎么样?也许你可以通过这种方式检查。

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’

参考

于 2013-01-07T16:46:33.663 回答
1

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

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

SELECT Moo FROM MyTable

采用

SELECT Moo FROM MyDB.MySchema.MyTable
于 2013-01-07T16:47:23.580 回答