2011-06-12 102 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