2012-06-13 15 views
0

我是T-SQL的暑期實習生,我必須在各種數據庫上運行sql select語句。我想要做的就是使用'if exists'來防止發生錯誤,因爲列表中的某些數據庫已經執行了此語句,因此不再存在。但是,我無法弄清楚如何將其應用於我的陳述。任何幫助將不勝感激。下面是statment我和另一位實習生說:T-SQL如果存在

select distinct mg.MatterName, mg.ClientNumber, mg.MatterNumber,grp.groupName as SecurityGroup 
from (select distinct mat.matterName, mat.clientNumber, mat.matterNumber, usr.GroupID 
    from <db_name>.dbo.matter mat 
    inner join <db_name>.dbo.usrAccount usr 
    on usr.NTlogin=mat.matterCreateBy) as mg 
      inner join <db_name>.dbo.usrGroup grp 
      on mg.groupID=grp.groupID 
order by matterName 

的< DB_NAME>是參數是數據庫的名稱傳遞,會去。

+0

http://stackoverflow.com/questions/679000/how-to-check-if-a方式-database-exists-in-sql-server – codingbiz

+0

我想我一定不會在我的語句周圍插入「如果存在」的部分,並且它沒有工作...... – Mike

回答

1

您可以使用sp_MSforeachdb來枚舉實例上的所有數據庫。

這將類似於:

exec sp_MSforeachdb 'select distinct mg.MatterName, mg.ClientNumber, mg.MatterNumber,grp.groupName as SecurityGroup from (select distinct mat.matterName, mat.clientNumber, mat.matterNumber, usr.GroupID  from ?.dbo.matter mat  inner join ?.dbo.usrAccount usr  on usr.NTlogin=mat.matterCreateBy) as mg   inner join ?.dbo.usrGroup grp   on mg.groupID=grp.groupID order by matterName' 

或者,您可以使用動態SQL製造的腳本:

select 'use ' + name + ';' + char(13) + 'select distinct mg.MatterName, mg.ClientNumber, mg.MatterNumber,grp.groupName as SecurityGroup' +CHAR(13) + 'from (select distinct mat.matterName, mat.clientNumber, mat.matterNumber, usr.GroupID' + char(13) + 'from dbo.matter mat' + char(13) + 'inner join dbo.usrAccount usr on usr.NTlogin=mat.matterCreateBy) as mg' + char(13) + 'inner join dbo.usrGroup grp on mg.groupID=grp.groupID' + CHAR(13) + 'order by matterName;' 
from master.sys.databases where database_id>4 

如果你重定向你的輸出到SSMS「結果爲文本」,然後運行腳本,您會看到一個腳本,然後您可以將其放入查詢編輯器中執行。

+0

我認爲那樣會很好,但正在發生的事情是IT部門在內部網站上有一個列表,並且可以單擊每個站點以查看訪問者的日誌。您還可以點擊每個網站的鏈接,查看該網站存在哪些活動的「重要事項」。但是有些網站不再使用,所以日誌仍然存在,但'事項'的數據庫不存在,所以當點擊鏈接時,它會出錯。所以我想要做的是:當鏈接被點擊,並且SQL語句返回的數據庫不存在時,它會加載一個不同的頁面,表示數據庫不再存在 – Mike

+0

我會建議這裏的問題是與應用程序不能正確處理錯誤。你有權訪問重構它來調用存儲過程嗎? –

+0

我確實有訪問權限,但我不知道如何創建存儲過程。這就是爲什麼我希望'如果存在'將是一個快速解決方案 – Mike

0

我得到它的工作。我認爲這有點hackey,但我所做的是捕獲拋出的異常,只是更改頁面上的標籤以反映數據庫不存在。

DataAccess dal = new DataAccess(); 
dal.SelectedConnectionString = "WebServer08"; 

String exNetName = Request.QueryString["name"]; 
if (exNetName != null && !exNetName.Equals("")) 
{ 
    try 
    { 
     gvMatters.DataSource = dal.GetMatters(exNetName); 
     gvMatters.DataBind(); 
     } 
     catch (Exception ex) 
     { 
     noDB.Text = "This database doesn't exist."; 
     gvMatters.Visible = false; 
     } 
} 

,我只是離開了SQL語句,它,而不是試圖耍着它