2010-01-04 4 views
0

Ok - 데이터베이스에 있거나 없을 수있는 테이블에 대해 동적으로 작성된 저장 프로 시저를 실행해야하는 경우가 있습니다. 검색된 데이터는 VB.Net 기반 ASP 기반 보고서 페이지로 분류됩니다. 기본적으로 테이블이 데이터베이스에 없으면 관련 데이터가 보고서 페이지에 자동으로 숨겨집니다. 현재 필자는 필연적 인 오류를 검사하고 catch 블록에 div를 숨겨서이 작업을 수행하고 있습니다. 약간 kludgy,하지만 효과가있었습니다.특정 OleDB 오류를 catch하는 기본 방법

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 관리 Studio에서 생성 된 스크립트를 카운트하기에는 너무 비슷한 코드를 보았습니다. 당신은 테이블 (또는 어떤 물체)이 있는지를 확인하는 방법이 내 두꺼운 두개골을 통과했을지도 모른다고 생각할 것입니다 ... ㅎ, 확실한 것을 노크하는 데 도움을 주신 것에 대해, 나는 그 것을 놓친다는 것을 믿을 수 없습니다. – Clyde

관련 문제