Die*_*ego 5 sql sql-server sql-server-2008-r2
我有一个带有USE DATABASE声明的脚本。如果数据库存在,脚本运行得很好。如果它不存在,它会失败并显示“数据库不存在”的消息,这是完全有道理的。
现在,我不会失败,所以我添加了一个检查来选择 sys.databases 上是否存在 DB(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
Run Code Online (Sandbox Code Playgroud)
我不相信你能做你想做的事。文档指定在编译时和use执行时执行。
因此,use在不存在的数据库上将产生编译时错误。我不知道有什么方法可以绕过编译时错误。
正如另一个答案所建议的,在所有名称中使用数据库限定符。
您还可以检查数据库是否存在,而无需切换到它。这是一种方法:
begin try
exec('use dum');
print 'database exists'
end try
begin catch
print 'database does not exist'
end catch
Run Code Online (Sandbox Code Playgroud)
这个怎么样?也许你可以用这种方式检查。
\n\nif db_id(\'dbname\') is not null\n -- do stuff\nRun Code Online (Sandbox Code Playgroud)\n\n或者试试这个:
\n\nif not exists(select * from sys.databases where name = \'dbname\')\n -- do stuff\nRun Code Online (Sandbox Code Playgroud)\n\n所以对于表:
\n\nif object_id(\'objectname\', \'somename\') is not null \nRun Code Online (Sandbox Code Playgroud)\n\n或者
\n\nsp_msforeachdb \xe2\x80\x98select * from ?.sys.tables\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n\n\n