2012-10-04 3 views
1

다음은 WMI 인터페이스를 통해 BizTalk 인스턴스를 일시 중단시키는 예제 VBScript에서 사용되는 SQL과 유사한 명령입니다. 실행할 수있는 방법이 있나요WMI 데이터를 T-SQL로 가져 오는 방법이 있습니까

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 

: http://msdn.microsoft.com/en-us/library/aa560069%28v=BTS.70%29.aspx

그것은 다음과 같이 VBScript로 사용됩니다

select * from MSBTS_serviceinstance where ServiceStatus=4 

MSBTS_serviceinstance는 여기에 정의 된대로하는 WMI 클래스, 테이블이 아니다 직접 T-SQL에서 유사한 명령. 이 데이터를 T-SQL의 테이블에 저장할 수 있다면 C# 또는 VBScript 프로그램을 작성할 필요가 없으며 DBA는 코드를 이해하고 유지할 수 있습니다. 이는 모니터링 및 경고 생성을위한 것입니다. 지금까지 대부분 SQL Agent 작업에 의해 수행되었습니다. [도로를 몇 주 또는 몇 달 동안 더 자세히 조사하기 위해 오리온의 태양풍을 사용하고있을 수도 있지만 가능한 빨리 작성해야합니다.]

+0

시도해 보지 않았지만 sp_OACreate 및 sp_OAMethod를 사용해도됩니다. http://msdn.microsoft.com/en-us/library/ms190501.aspx – rene

+0

CLR 저장 프로 시저를 사용할 수는 있지만 확실하지 않습니다. DBA가 VBScript를 이해하지 못하는 이유 또는 PowerShell을 더 잘 이해할 수없는 이유는 무엇입니까? – Pondlife

답변

1

알고있는 한 은 없습니다. 직접 "쿼리"T-SQL의 WMI 클래스. WMI 쿼리를 실행하려면 .Net Framework 응용 프로그램, 스크립트 언어 등에서 일반적으로 수행되는 WMI 인프라를 활용해야합니다. 그러나 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 

참고 :

  1. 나는 BizTalk 설치와 서버가없는, 그래서 나는/테스트 위의 코드를 확인할 수 없습니다. 대소 문자를 구분하는 것과 같은 문제가있을 수 있습니다. 결국 XML입니다.
  2. 완료하면 xp_cmdshell을 사용 중지하는 것을 잊지 마세요.
관련 문제