Tsql 有没有办法将WMI数据导入T-SQL
以下是示例VBScript中使用的类似SQL的命令,用于通过WMI接口获取Biztalk挂起实例Tsql 有没有办法将WMI数据导入T-SQL,tsql,wmi,monitor,wmi-query,Tsql,Wmi,Monitor,Wmi Query,以下是示例VBScript中使用的类似SQL的命令,用于通过WMI接口获取Biztalk挂起实例 select * from MSBTS_serviceinstance where ServiceStatus=4 MSBTS_serviceinstance不是一个表,它是一个WMI类,定义如下: 它在VBScript中的使用方式如下: sQuery = "select * from MSBTS_serviceinstance where ServiceStatus=4 and Erro
select * from MSBTS_serviceinstance where ServiceStatus=4
MSBTS_serviceinstance不是一个表,它是一个WMI类,定义如下:
它在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代理作业完成的。[未来几周或几个月,我们可能会使用猎户座的太阳风来进行更多监控,但我需要尽快创建一个快速警报。]据我所知,无法直接从T-SQL“查询”WMI类。要运行WMI查询,您需要利用WMI基础结构,这通常是通过.Net Framework应用程序、脚本语言等完成的。但是,您可以从T-SQL间接访问WMI 在我们开始讨论之前,先谈谈
xp\u cmdshell
。我既不主张也不反对启用和使用扩展存储过程。这个答案仅仅显示了对于特定用例可能发生的事情。是否可以启用xp\u cmdshell
如果它尚未启用。我们将按如下方式运行WMIC.exe
,并将输出作为原始“XML”捕获到临时表中。之后,我们将获取“XML数据”,并将其转换为强类型的实际XML数据,然后将其分解。我们在结果集中返回强类型数据,在Win32\u进程
类中,每个字段对应一列
参考:
注意事项:
xp\u cmdshell
李>
虽然没有尝试过,但sp_OACreate和sp_OAMethod可能就这么做了。您可以使用CLR存储过程,但我不确定为什么您的DBA不能理解VBScript,或者更确切地说,不能理解PowerShell?
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