2011-06-12 71 views
4

如果USE {invalid_database_name}失败,最好的处理方法是什么?我想在这种情况下忽略其余的陈述。这是为了避免在错误的数据库上意外运行脚本。 感谢您的建议!SQL SERVER 2005 USE语句

回答

1

要检查数据库是否存在:

IF DB_ID("<your database>" IS NOT NULL 
BEGIN 
    // Your code here 
END 

,或者如果它是一个存储过程:

IF DB_ID("<your database>" IS NULL 
BEGIN 
    RETURN 
END 

这是更好的,当搜索在sysobjects。

+0

谢谢..它的工作原理。 – 2011-06-17 07:34:15

2

您需要检查是否有名称数据库由

IF EXISTS (SELECT 1 FROM master.dbo.sysdatabases 
      WHERE ('[' + name + ']' = @dbname OR name = @dbname)) 
BEGIN 
    --Your Code here 
    [USE myDatabase] 
END 
+0

USE @dbname不起作用。 USE不接受变量。你必须做下面的事情。 exec('USE'+ @dbname) – Khepri 2011-06-12 04:11:07

+0

谢谢你让我知道。我更新了答案。 – Akhil 2011-06-12 04:12:42

3

存在SSMS中SQLCMD mode运行脚本,并使用:on error exit。如果从应用程序运行脚本,请使用兼容sqlcmd模式的库,如dbutilsqlcmd

编辑

什么许多答复建议各种形式的IFRETURNsp_executesql缺少的是,他们只解决不执行一批(通过该分隔GO序列)的问题。这在讨论脚本时很有用。验证数据库存在的批处理会跳过这些语句,但是,脚本中的下一批将继续执行它在当前数据库中执行的任何操作(例如,创建表),而不是在所需的数据库中。在每批请求中添加一个检查是很繁琐和容易出错的,将整个脚本放在一个批次中通常是不可能的。最好的解决办法是简单地做一个USE <inexisting name>并依靠:on error exit中断第一个错误的脚本执行。

0

尝试使用此

begin try 
declare @use nvarchar(50) 
set @use= 'use MyDB' 
exec sp_executesql @use 

select top 1 * from MyDB.dbo.TableA 


end try 
begin catch 
print @@ERROR --Error Number of Database not Found 
print Error_message() -- Proper Message 
end catch