2

以下は、WMI インターフェイス経由で Biztalk サスペンド インスタンスを取得するためにサンプル VBScript で使用される SQL に似たコマンドです。

select * from MSBTS_serviceinstance where ServiceStatus=4 

MSBTS_serviceinstance はテーブルではなく、ここで定義されている WMI クラスです: http://msdn.microsoft.com/en-us/library/aa560069%28v=BTS.70%29.aspx

VBScript では次のように使用されます。

 sQuery  = "select * from MSBTS_serviceinstance where ServiceStatus=4 and ErrorId ='" & sErrorCode & "'"   
  Set intSet = GetObject("Winmgmts:!root\MicrosoftBizTalkServer").ExecQuery(sQuery)
  ' then you have to loop through the results 

同様のコマンドを直接 T-SQL から実行する方法はありますか。そのデータを取得して T-SQL からテーブルに格納できれば、C# や VBScript プログラムを作成する必要がなくなり、DBA もコードを理解して維持できるようになります。これは、アラートの監視と作成を目的としています。これまでのところ、これは主に SQL エージェント ジョブによって行われています。[数週間または数か月後、オリオンのソーラーウィンドを使用してより多くの監視を行う可能性がありますが、できるだけ早く迅速なアラートを作成する必要があります.]

4

1 に答える 1

1

私の知る限り、T-SQL から WMI クラスを直接"クエリ" する方法はありません。WMI クエリを実行するには、WMI インフラストラクチャを活用する必要があります。これは通常、.Net Framework アプリケーションやスクリプト言語などから実行されます。ただし、T-SQL から 間接的に WMI にアクセスすることもできます。

先に進む前に、 について少し説明しますxp_cmdshell。私は、拡張ストアド プロシージャを有効にして使用することを推奨したり、否定したりしているわけではありません。この回答は、特定のユースケースで可能なことを示しているにすぎません。有効にしてもxp_cmdshellよろしいですか?自分で決めてください

まだ有効になっていない場合は、有効にxp_cmdshellします。次のように実行WMIC.exeし、出力を生の「XML」として一時テーブルにキャプチャします。その後、その「XML データ」を取得して、厳密に型指定された実際の XML データにキャストし、細断処理します。Win32_Processクラスのフィールドごとに 1 つの列を持つ、厳密に型指定されたデータが結果セットに返されます。

参照: SQL Server 内からの WMI クエリ...並べ替え

CREATE TABLE #WMIC (
    ID INT IDENTITY PRIMARY KEY,
    CmdOutput VARCHAR(1000)
)

INSERT INTO #WMIC (CmdOutput)
EXECUTE master..xp_cmdshell 'WMIC.exe MSBTS_serviceinstance get Name,ServiceName,ServiceStatus,SuspendTime /FORMAT:RAWXML'

DECLARE @Cmd VARCHAR(MAX) = ''
DECLARE @Xml XML

SELECT @Cmd = @Cmd + COALESCE(w.CmdOutput, '') 
FROM #WMIC w
ORDER BY w.ID

SET @Xml = CAST(@Cmd AS XML)

SELECT
    Name = BT_Service.value('(PROPERTY[@NAME="Name"]/VALUE)[1]', 'VARCHAR(512)'),
    ServiceName = BT_Service.value('(PROPERTY[@NAME="ServiceName"]/VALUE)[1]', 'VARCHAR(512)'),
    ServiceStatus = BT_Service.value('(PROPERTY[@NAME="ServiceStatus"]/VALUE)[1]', 'INT'),
    SuspendTime = BT_Service.value('(PROPERTY[@NAME="SuspendTime"]/VALUE)[1]', 'DATETIME')
FROM @Xml.nodes('/COMMAND/RESULTS/CIM/INSTANCE') AS WmiTbl(BT_Service)
WHERE BT_Service.value('(PROPERTY[@NAME="ServiceStatus"]/VALUE)[1]', 'INT') = 4

DROP TABLE #WMIC

ノート:

  1. BizTalk がインストールされたサーバーを持っていないため、上記のコードをテスト/検証できませんでした。そのままでは大文字と小文字の区別に問題がある可能性があります...これは結局のところ XML です。
  2. 完了したら、無効にすることを忘れないでくださいxp_cmdshell
于 2015-12-14T22:13:56.227 に答える