Tsql 有没有办法将WMI数据导入T-SQL

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

以下是示例VBScript中使用的类似SQL的命令,用于通过WMI接口获取Biztalk挂起实例

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进程
类中,每个字段对应一列

参考:

注意事项:

  • 我没有安装BizTalk的服务器,因此无法测试/验证上述代码。区分大小写可能会有一些问题……毕竟是XML
  • 完成后不要忘记禁用
    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