パッケージ内のエラーを見つけるためにSSISDBにクエリを実行する方法は?



How Query Ssisdb Find Out Errors Packages



解決:

使用するクエリがいくつかあります。一般的な概念は、情報を含むテーブルは次のとおりです。catalog.operation_messagesで、120(エラー)タイプのイベントに関心があります。

構築するクエリの堅牢性に応じて、次の2つの派生テーブルも重要になる場合があります。



--- http://technet.microsoft.com/en-us/library/ff877994.aspx--このクエリは、SSISDB.catalog.operation_messagesからのmessage_typeを-有用なテキストに変換しますSELECT D.message_type、D.message_desc FROM( VALUES(-1、 'Unknown')、(120、 'Error')、(110、 'Warning')、(70、 'Information')、(10、 'Pre-validate')、(20、 'Post-検証 ')、(30、'実行前 ')、(40、'実行後 ')、(60、'進行状況 ')、(50、'ステータス変更 ')、(100、'クエリキャンセル ')、(130 、 'TaskFailed')、(90、 'Diagnostic')、(200、 'Custom')、(140、 'DiagnosticExパッケージの実行タスクが子パッケージを実行するたびに、このイベントをログに記録します。イベントメッセージはパラメーター値で構成されます。子パッケージに渡されます。DiagnosticExのメッセージ列の値はXMLテキストです。 ')、(400、' NonDiagnostic ')、(80、' VariableValueChanged '))D(message_type、message_desc); -エラーメッセージはどこで生成されましたか? SELECT D.message_source_type、D.message_source_desc FROM(VALUES(10、 'T-SQLやCLRストアドプロシージャなどのエントリAPI')、(20、 'パッケージの実行に使用される外部プロセス(ISServerExec.exe)')、(30 、 'パッケージレベルのオブジェクト')、(40、 '制御フロータスク')、(50、 '制御フローコンテナ')、(60、 'データフロータスク'))D(message_source_type、message_source_desc);

このようなクエリを使用して、エラーに関する情報を検索します。たぶん私はエラーが何であるかだけを気にします(クエリ1)。また、失敗したすべての操作のすべてのアクティビティを知りたい場合もあります(クエリ2)。一般的に、私は怠惰で、最後に失敗した操作に関するすべての情報を確認したいと思います(クエリ3と警告に注意してください)。

--http://msdn.microsoft.com/en-us/library/ff877994.aspx-すべてのエラーメッセージを検索しますSELECT OM.operation_message_id、OM.operation_id、OM.message_time、OM.message_type、OM.message_source_type、OM。メッセージ、OM.extended_info_id FROM catalog.operation_messages AS OM WHERE OM.message_type = 120; -失敗した操作に関連するすべてのメッセージを生成しますSELECTOM.operation_message_id、OM.operation_id、OM.message_time、OM.message_type、OM.message_source_type、OM.message、OM.extended_info_id FROM catalog.operation_messages AS OM INNER JOIN(-検索失敗した操作SELECTDISTINCT OM.operation_id FROM catalog.operation_messages AS OM WHERE OM.message_type = 120)D ON D.operation_id = OM.operation_id; -最後に失敗した実行に関連付けられているすべてのメッセージを検索しますSELECTOM.operation_message_id、OM.operation_id、OM.message_time、OM.message_type、OM.message_source_type、OM.message、OM.extended_info_id FROM catalog.operation_messages AS OM WHERE OM.operation_id = (-最後に失敗した操作を見つける-最大の操作-idが最後であるという怠惰な仮定。長い-実行中のプロセスがクイックプロセスの後に失敗する-も失敗した場合は正しくない可能性がありますSELECT MAX(OM.operation_id)FROMカタログ.operation_messages AS OM WHERE OM.message_type = 120);

おそらく私は怠惰で、あなたのチームがやったように見えるのと同じように、失敗した場合にこの情報を調べに行きたくありません。オンデマンドで実行されるSQLエージェントジョブがあり、SSISパッケージを実行するジョブが失敗した場合にそのジョブを実行するように設定されています。



DECLARE @profile_name sysname = 'SQLAdmins'、@ recipients varchar(max)= '[メール保護]'、@ copy_recipients varchar(max)= NULL、@ Blind_copy_recipients varchar(max)= NULL、@ subject nvarchar(255)= '失敗しましたパッケージテスト '、@ body nvarchar(max)='スタッフが失敗しました、修正してください '、@ body_format varchar(20)= NULL、@ importance varchar(6)=' NORMAL '、@ sensitive vchar(12)=' NORMAL ' 、@ file_attachments nvarchar(max)= NULL、@ query nvarchar(max)= N'SELECT O.object_name AS FailingPackageName、O.object_id、O.caller_name、O.server_name、O.operation_id、OM.message_time、EM.message_desc、 D.message_source_desc、OM.message FROM SSISDB.catalog.operation_messages AS OM INNER JOIN SSISDB.catalog.operations AS O ON O.operation_id = OM.operation_id INNER JOIN(VALUES(-1、 '' Unknown '')、(120、 ''エラー '')、(110、 ''警告 '')、(70、 ''情報 '')、(10、 ''事前検証 '')、(20、 ''事後検証 '') 、(30、 ''実行前 '')、(40、 ''実行後 '')、(60、 ''進行状況 '')、(50、 ''ステータス変更 '') 、(100、 '' QueryCancel '')、(130、 '' TaskFailed '')、(90、 '' Diagnostic '')、(200、 '' Custom '')、(140、 '' DiagnosticEx実行するたびにパッケージタスクは子パッケージを実行し、このイベントをログに記録します。イベントメッセージは、子パッケージに渡されるパラメータ値で構成されます。 DiagnosticExのメッセージ列の値はXMLテキストです。 '')、(400、 '' NonDiagnostic '')、(80、 '' VariableValueChanged ''))EM(message_type、message_desc)ON EM.message_type = OM.message_type INNER JOIN(VALUES(10、 '' T-SQLやCLRストアドプロシージャなどのエントリAPI '')、(20、 ''パッケージの実行に使用される外部プロセス(ISServerExec.exe) '')、(30、 ''パッケージレベルのオブジェクト '')、(40、 ''コントロールフロータスク '')、(50、 ''コントロールフローコンテナ '')、(60、 ''データフロータスク ''))D(message_source_type、message_source_desc) ON D.message_source_type = OM.message_source_type WHERE OM.operation_id =(SELECT MAX(OM.operation_id)FROM SSISDB.catalog.operation_messages AS OM WHERE OM.message_type = 120)AND OM.message_type IN(120、130); '、@ execute_query_database sysname = NULL、@ attach_query_result_as_file bit = 0、@ query_attachment_filename nvarchar(260)= NULL、@ query_result_header bit = 1、@ query_result_width int = 256、@ query_result_separator char(1)= char(13)、@ exclude = 0、@ append_query_errorビット= 0、@ query_no_truncateビット= 0、@ query_result_no_paddingビット= 0、@ mailitem_id int = NULL、@ from_address varchar(max)= NULL、@ reply_to varchar(max)= NULL; -失敗に関するメールを送信するEXECUTEmsdb.dbo.sp_send_dbmail @ profile_name、@ recipients、@ copy_recipients、@ Blind_copy_recipients、@ subject、@ body、@ body_format、@ importance、@ sensitivevity、@ file_attachments、@ query、@ execute_query attach_query_result_as_file、@ query_attachment_filename、@ query_result_header、@ query_result_width、@ query_result_separator、@ exclude_query_output、@ append_query_error、@ query_no_truncate、@ query_result_no_padding、@ rep_id OUTPUT;

好きなように調整してください


次を使用できます。

SELECT OPR.object_name、MSG.message_time、MSG.message FROM catalog.operation_messages AS MSG INNER JOIN catalog.operations AS OPR ON OPR.operation_id = MSG.operation_id WHERE MSG.message_type = 120

これにより、SSISパッケージの実行からのエラーメッセージのみが表示されます。




SSISDBからジョブエラーメッセージを見つけるために作成したクエリの1つを次に示します。

DECLARE @DATE DATE = GETDATE()-7-これは、ON条件で使用される過去7日間のデータを制限するためのものですSELECT O.Operation_Id-あまり使用されない、E.Folder_Name AS Project_Name、E.Project_name AS SSIS_Project_Name、 EM.Package_Name、CONVERT(DATETIME、O.start_time)AS Start_Time、CONVERT(DATETIME、O.end_time)AS End_Time、OM.message as [Error_Message]、EM.Event_Name、EM.Message_Source_Name AS Component_Name、EM.Subcomponent_Name AS Sub_Component_Name、 E.Environment_Name、CASE E.Use32BitRunTime WHEN 1 THEN'Yes 'ELSE'NO' END Use32BitRunTime、EM.Package_Path、E.Executed_as_name AS Executed_By FROM [SSISDB]。[internal]。[operations] AS O INNER JOIN [SSISDB]。 [内部]。[event_messages] AS EM ON o.start_time> = @ date-日付でデータを制限ANDEM.operation_id = O.operation_id-編集:ここでエイリアスをOMからOMに変更します:INNER JOIN [SSISDB] 。[internal]。[operation_messages] AS OM ON EM.operation_id = OM.operation_id INNER JOIN [SSISDB]。[internal]。[executions] AS E ON OM.Operation_id = E.EXE CUTION_ID WHERE OM.Message_Type = 120 --120はエラーを意味し、EM.event_name = 'OnError'-これは今のところわかりませんが、SSIS.Pipelineは重複を追加しているだけなので、削除します。 AND ISNULL(EM.subcomponent_name、 '') 'SSIS.Pipeline' ORDER BY EM.operation_id DESC

詳細な説明については、SSISDBにクエリを実行してパッケージ内のエラーを見つける方法を教えてください。