2

以下是示例 VBScript 中用于通过 WMI 接口获取 Biztalk 挂起实例的类似 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类的每个字段对应一列。

参考: 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 回答