2017-12-05 23 views
2

try catchブロックを使用して以下のクエリのエラーをキャッチしようとしていますが、クエリがエラーをスローしても、クエリはcatchブロックに当たっていません。 「SQL Server 2008 R2のキャッチエラーが発生しません

メッセージ7314、レベル16、状態1、プロシージャproc_nameに、リンクサーバー用ライン97 OLE DBプロバイダー「SQLNCLI11」:私は、エラーの下に取得していますtry-catchブロックを使用せずにクエリを実行していた場合LINKEDSERVER "にテーブル" "DB_NAME"。 "dbo"。 "VIEW_NAME" "が含まれていません。テーブルが存在しないか、現在のユーザーにそのテーブルに対するアクセス許可がありません。 メッセージ2020、レベル16、状態1、行34 エンティティ "SP_NAME"に対して報告された依存関係には、すべての列への参照が含まれていない可能性があります。これは、エンティティが存在しないオブジェクトを参照するか、エンティティ内の1つ以上のステートメントにエラーがあるためです。照会を再実行する前に、エンティティーにエラーがなく、エンティティーが参照するすべてのオブジェクトが存在することを確認してください。

SELECT DISTINCT NAME INTO #ALL_SPS FROM SYSOBJECTS SO,SYSCOMMENTS SC WHERE SO.ID = SC.ID 
AND TEXT LIKE '%LINKEDSERVER%' 

CREATE TABLE #ERRORS 
(
    ERRORNUMBER VARCHAR(100), 
    ERRORSEVERITY VARCHAR(100), 
    ERRORSTATE VARCHAR(100), 
    ERRORPROCEDURE VARCHAR(100), 
    ERRORLINE VARCHAR(100), 
    ERRORMESSAGE VARCHAR(100) 
) 

CREATE TABLE #TEMP(SP_NAME VARCHAR(500),DB VARCHAR(100), LINKEDSERVER VARCHAR(100)) 

BEGIN  
DECLARE @SP_NAME VARCHAR(MAX) 
DECLARE @STARTTIME DATETIME =GETDATE() 

DECLARE HDR_CURSOR CURSOR FOR 

SELECT NAME FROM #ALL_SPS --IS TEMP TABLE IMPORTED FROM SHARED EXCEL 

OPEN HDR_CURSOR  

FETCH NEXT FROM HDR_CURSOR INTO @SP_NAME 

WHILE (@@FETCH_STATUS = 0)  
    BEGIN  
BEGIN TRY 
BEGIN TRANSACTION; 

    INSERT INTO #TEMP 
    SELECT 
    TBLSQLREFERENCEDENTITY.REFERENCED_ENTITY_NAME AS REFERENCEDENTITY, 
    COALESCE(REFERENCED_DATABASE_NAME,DB_NAME()) AS REFERENCEDDATABASE, 
    COALESCE(TBLSQLREFERENCEDENTITY.REFERENCED_SERVER_NAME,'CURRENT SERVER') AS REFERENCEDSERVER 
    FROM SYS.DM_SQL_REFERENCED_ENTITIES('DBO.'[email protected]_NAME, 'OBJECT') TBLSQLREFERENCEDENTITY 
    WHERE TBLSQLREFERENCEDENTITY.REFERENCED_SERVER_NAME ='LINKEDSERVER' 
    GROUP BY REFERENCED_ENTITY_NAME,REFERENCED_DATABASE_NAME,REFERENCED_SERVER_NAME 
    COMMIT TRANSACTION; 
END TRY 
BEGIN CATCH 

INSERT INTO #ERRORS 
SELECT ERROR_NUMBER() AS ERRORNUMBER 
    ,ERROR_SEVERITY() AS ERRORSEVERITY 
    ,ERROR_STATE() AS ERRORSTATE 
    ,ERROR_PROCEDURE() AS ERRORPROCEDURE 
    ,ERROR_LINE() AS ERRORLINE 
    ,ERROR_MESSAGE() AS ERRORMESSAGE; 

END CATCH 
    FETCH NEXT FROM HDR_CURSOR INTO @SP_NAME 

END  
CLOSE HDR_CURSOR  
DEALLOCATE HDR_CURSOR  
SELECT DATEDIFF(MS,@STARTTIME,GETDATE()) 'TIME TAKEN IN MS' 
SELECT DISTINCT * FROM #TEMP 
SELECT DISTINCT * FROM #ERRORS 

END 
+1

IN "TをAREN CURRENT DB内のオブジェクトを決定古いスタイルのカンマ構文のJOINを使用しないでください。https://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause – Shawn

+0

共有サーバーの権限をダブルチェックしてください。適切なユーザーが共有テーブルにアクセスできますか? – Shawn

+0

@shawnサーバーで書き込みアクセス権と実行アクセス権を持っています – Shardul

答えて

1

あなたはコンパイルして実行時エラーを混合しています。あなたがそのテーブルへのアクセス権を持っていると仮定すると、これを行うには良い方法は何かのようになります...

... 
BEGIN TRANSACTION; 

--see if that object exists in your linked server... 
if(select 1 
    from YourLinkedServer.master.sys.objects 
    where [name] = @SP_NAME) is not null 


--if it exists, then insert from it... 
INSERT INTO #TEMP 
SELECT 
TBLSQLREFERENCEDENTITY.REFERENCED_ENTITY_NAME AS REFERENCEDENTITY, 
COALESCE(REFERENCED_DATABASE_NAME,DB_NAME()) AS REFERENCEDDATABASE, 
COALESCE(TBLSQLREFERENCEDENTITY.REFERENCED_SERVER_NAME,'CURRENT SERVER') AS REFERENCEDSERVER 
FROM SYS.DM_SQL_REFERENCED_ENTITIES('DBO.'[email protected]_NAME, 'OBJECT') TBLSQLREFERENCEDENTITY 
WHERE TBLSQLREFERENCEDENTITY.REFERENCED_SERVER_NAME ='LINKEDSERVER' 
GROUP BY REFERENCED_ENTITY_NAME,REFERENCED_DATABASE_NAME,REFERENCED_SERVER_NAME 

COMMIT TRANSACTION; 

... 

リンクサーバー

use [theDatabaseYourCareAbout] 

select 
    [name] 
from sys.objects 
where type in ('P','V') --procedures and views 
except 
select 
    [name] 
from YourLinkedServer.master.sys.objects 
where type in ('P','V') --procedures and views 
+0

あなたの意見を共有してくれてありがとう。しかし、私は実際には、欠落しているオブジェクトを追跡し、それを文書化して関係するチームに通知できるように、エラーをキャッチしたいと考えています。私たちはシステム統合テストを行っています。 – Shardul

+0

2つのデータベース(データベース内のすべてのオブジェクト、ビュー、ストアドプロシージャ、テーブル)を比較し、オブジェクトの欠落やスキーマexの欠落などの違いを調べる方法はありますか。表またはビューの列名または列数の不一致。いくつかのコードを共有して参考にすることができれば非常に役に立ちます。 – Shardul

+0

でも、これを使用してランタイムエラーをキャッチできます。しかし、コンパイル時のエラーを捕らえることはできません。 – scsimon

関連する問題