私の知る限り、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
ノート:
- BizTalk がインストールされたサーバーを持っていないため、上記のコードをテスト/検証できませんでした。そのままでは大文字と小文字の区別に問題がある可能性があります...これは結局のところ XML です。
- 完了したら、無効にすることを忘れないでください
xp_cmdshell。