我有一个带有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
答案 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’
答案 2 :(得分:1)
在我的头顶,您可以完全限定所有引用,以避免USE
语句。
我希望有人提出一个需要较少PT的解决方案。
在检查数据库是否存在之后,而不是
SELECT Moo FROM MyTable
使用
SELECT Moo FROM MyDB.MySchema.MyTable