2013-05-31 82 views
1

我在SQL Server中的XML類型列:SQL Server中的XML類型

<LogMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LogMessageBusinessServiceRequest"> 
    <Application>Services.Business.myapp</Application> 
    <Time>2013-05-30T15:01:38.932Z</Time> 
    <Level>Info</Level> 
    <Message>MultiQuery Biz Request</Message> 
    <MachineName>Machine1</MachineName> 
    <ThreadId>16084</ThreadId> 
    <Callsite>BLAH</Callsite> 
    <CreatedBy>Machine1\svc_biz_myapp</CreatedBy> 
    <Context> 
    <myappExtraInfo xmlns="http://services.somedomain.com/myapp/logging/extraInfo" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <CallType>MultiProcessQuery</CallType> 
     <RequestId>r163505508498822282742</RequestId> 
     <FirmId>160</FirmId> 
     <PMFirmId>203</PMFirmId> 
     <SubscriptionId>0</SubscriptionId> 
     <Token /> 
     <LastClientSvcTimeMs>0</LastClientSvcTimeMs> 
     <ResultCode>0</ResultCode> 
     <ResultCodeDescription>OK</ResultCodeDescription> 
     <ElapsedTimeTotalMs>110</ElapsedTimeTotalMs> 
     <ElapsedTimeMtMs>110</ElapsedTimeMtMs> 
     <ElapsedTimeDacMs>109</ElapsedTimeDacMs> 
     <ElapsedTimePMSSMs>-1</ElapsedTimePMSSMs> 
    </myappExtraInfo> 
    </Context> 

我想從那裏得到的FirmID。但我不能與我的選擇聲明的以下部分:

select 
[Body].value('(/LogMessage/Context/myappExtraInfo/FirmId)[1]', 'varchar(max)') FirmID 

我做錯了什麼?

謝謝你的時間。

  • Shiyam

回答

0

試試這個 - 你需要尊重這是你的<myappExtraInfo>節點上定義的XML命名空間(並因此適用於所有的子節點,太):

DECLARE @Test TABLE (ID INT NOT NULL, XmlContent XML) 

INSERT INTO @Test VALUES(1, 
'<LogMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LogMessageBusinessServiceRequest"> 
    <Application>Services.Business.myapp</Application> 
    <Time>2013-05-30T15:01:38.932Z</Time> 
    <Level>Info</Level> 
    <Message>MultiQuery Biz Request</Message> 
    <MachineName>Machine1</MachineName> 
    <ThreadId>16084</ThreadId> 
    <Callsite>BLAH</Callsite> 
    <CreatedBy>Machine1\svc_biz_myapp</CreatedBy> 
    <Context> 
    <myappExtraInfo xmlns="http://services.somedomain.com/myapp/logging/extraInfo" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <CallType>MultiProcessQuery</CallType> 
     <RequestId>r163505508498822282742</RequestId> 
     <FirmId>160</FirmId> 
     <PMFirmId>203</PMFirmId> 
     <SubscriptionId>0</SubscriptionId> 
     <Token /> 
     <LastClientSvcTimeMs>0</LastClientSvcTimeMs> 
     <ResultCode>0</ResultCode> 
     <ResultCodeDescription>OK</ResultCodeDescription> 
     <ElapsedTimeTotalMs>110</ElapsedTimeTotalMs> 
     <ElapsedTimeMtMs>110</ElapsedTimeMtMs> 
     <ElapsedTimeDacMs>109</ElapsedTimeDacMs> 
     <ElapsedTimePMSSMs>-1</ElapsedTimePMSSMs> 
    </myappExtraInfo> 
    </Context> 
</LogMessage>') 


;WITH XMLNAMESPACES('http://services.somedomain.com/myapp/logging/extraInfo' AS ns) 
SELECT 
    XmlContent.value('(/LogMessage/Context/ns:myappExtraInfo/ns:FirmId)[1]', 'int') 
FROM @Test 
WHERE ID = 1 

這將值160返回給我。