以下是样本VBScript中使用的类似SQL的命令,用于通过WMI接口获取Biztalk挂起实例。
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 Agent Jobs完成。 [在路上几周或几个月我们可能会使用猎户座太阳风进行更多监控,但我需要尽快创建快速警报。]
答案 0 :(得分:1)
据我所知,没有办法直接从T-SQL“查询”WMI类。要运行WMI查询,您需要利用WMI基础结构,这通常是从.Net Framework应用程序,脚本语言等完成的。但是,您可以从T-SQL访问WMI 间接。
在我们走远之前,先谈谈xp_cmdshell
。我既不提倡也不谴责扩展存储过程的启用和使用。这个答案仅仅说明了特定用例的可能性。是否可以启用xp_cmdshell
? Decide for yourself。
如果尚未启用enable xp_cmdshell
。我们将按如下方式运行WMIC.exe
,并将输出捕获为原始“XML”到临时表。之后,我们将获取“XML数据”并将其转换为强类型的实际XML数据,并将其粉碎。我们在结果集中返回强类型数据,Win32_Process
类的每个字段都有一列。
参考:WMI Queries From Within SQL Server...Sort Of
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
注意:
xp_cmdshell
!