2010-01-04 16 views
0

好吧 - 我有一種情況,我必須執行一個動態構建的存儲過程對可能或可能不在數據庫中的表。然後將檢索到的數據分流到基於VB.Net的基於ASP的報告頁面。按照設計,如果表格不存在於數據庫中,相關數據將自動隱藏在報告頁面上。目前,我正在通過檢查不可避免的錯誤並將該div隱藏在catch塊中來做到這一點。有點kludgy,但它的工作。首選的方法來捕獲特定OleDB錯誤

我不能包含VB代碼隱藏,但相關的存儲過程包含在下面。

但是,這個方法的一個問題最近引起了我的注意,因爲沒有明顯的原因,即使正確的數據可用,div也被隱藏了。事實證明,試圖在動態SQL調用中選擇表的用戶沒有適當的選擇權限,一旦我可以追蹤它,這是一個很容易的修復。

所以,兩個問題。首先,有沒有更好的方法來檢查缺少的表格,而不是通過捕獲VB.Net代碼隱藏中的錯誤?所有考慮的事情,我寧願保存錯誤檢查一個實際的錯誤。其次,是否有一種首選方法可以從try-> catch塊捕獲的通用對象中鬆出特定的OLE DB錯誤,而不僅僅是檢查實際的堆棧跟蹤字符串?

SQL查詢 - 代碼的主要要點是,由於數據庫的設計,我必須確定手動定位的實際表的名稱。數據庫將作業記錄在單個表中,但每個作業也都有自己的表,用於處理在該作業中處理的項目的數據,而且它是來自我必須檢索的那些表中的數據。不幸的是,我無法做到這一點。

DECLARE @sql     NVarChar(Max), 
      @params    NVarChar(Max), 
      @where    NVarChar(Max) 

-- Retained for live testing of stored procedure. 
-- DECLARE @Table NvarChar(255) SET @Table = N'tblMSGExportMessage_10000' 
-- DECLARE @AcctID Integer SET @AcctID = 10000 
-- DECLARE @Type Integer SET @Type = 0 -- 0 = Errors only, 1 = All Messages 
-- DECLARE @Count Integer 

-- Sets our parameters for our two dynamic SQL calls. 
SELECT @params = N'@MsgExportAccount INT, @cnt INT OUTPUT' 

-- Sets our where clause dependent upon whether we want all results or just errors. 
IF @Type = 0 
    BEGIN 
      SELECT @where = 
      N' AND (mem.[MSGExportStatus_OPT_CD] IN (11100, 11102) ' + 
      N'  OR mem.[IngestionStatus_OPT_CD] IN (11800, 11802, 11803) ' + 
      N'  OR mem.[ShortcutStatus_OPT_CD] IN (11500, 11502)) ' 
    END 
ELSE 
    BEGIN 
      SELECT @where = N' ' 
    END 

-- Retrieves a count of messages. 
SELECT @sql = 
N'SELECT @cnt = Count(*) FROM dbo.' + QuoteName(@Table) + N' AS mem ' + 
N'WHERE mem.[MSGExportAccount_ID] = @MsgExportAccount ' + @where 

EXEC sp_executesql @sql, @params, @AcctID, @cnt = @Count OUTPUT 

回答

1

爲避免出現錯誤,您可以查詢sysobjects表以確定表是否存在。這裏是SQL(替換YourTableNameHere)。如果它返回> 0,則表存在。在運行此查詢的服務器上創建一個存儲過程。

select count(*) 
from sysobjects a with(nolock) 
where a.xtype = 'U' 
    and a.name = 'YourTableNameHere' 
+0

你知道嗎,我已經看到了代碼 - 非常相似 - 太多時間來從SQL管理工作室計算生成的腳本。你會認爲這可能是通過我厚厚的頭骨得到的,這就是你如何檢查一張桌子(或任何物體)是否存在......嘿,謝謝你幫助敲開顯而易見的通道,我不能相信我錯過了那一個。 – Clyde 2010-01-06 15:25:00

相關問題