2012-07-26 89 views
1

对不起这种n00b问题,但这是我第一次在SQL Server(2005)中处理XML。这是我认为会工作...带命名空间的SQL Server 2005 XML

DECLARE @doc xml 

SET @doc = 

'<?xml version="1.0" encoding="UTF-8"?> 
<p:OrderRequest xmlns:p="http://xxx.OrderRequest/2" xmlns:xsi="http://xxx.XMLSchema-instance" xsi:schemaLocation="http://xxx.OrderRequestV2.xsd "> 
    <p:Header> 
    <p:LLLRequestCount>0</p:LLLRequestCount> 
    <p:MFRRequestCount>1</p:MFRRequestCount> 
    <p:FileCreatedAt>2001-12-31T12:00:00</p:FileCreatedAt> 
    <p:RequestFileName>p:RequestFileName</p:RequestFileName> 
    </p:Header> 
    <p:RequestItems> 
    <p:MFRRequest id="1" priority=""> 
     <p:AccountNumber>9999999</p:AccountNumber> 
     <Status>Initial</Status> 
     <p:CaseInformation> 
     <ReferralDate>2011-01-01</ReferralDate> 
     <Type>1A</Type> 
     <ARM>Yes</ARM> 
     <InvestorNumber>InvestorNumber</InvestorNumber> 
     <PropertyAddress>PropertyAddress</PropertyAddress> 
     <PrivateLabel>Yes</PrivateLabel> 
     <CaseNumber>01-11111/AK/</CaseNumber> 
     <SuspenseBalance>9999.00</SuspenseBalance> 
     <TitleOrderedDate>2011-09-01</TitleOrderedDate> 
     <TotalMonthlyPayment>876.99</TotalMonthlyPayment> 
     </p:CaseInformation> 
    </p:MFRRequest> 
    </p:RequestItems> 
</p:OrderRequest>' 
;WITH XMLNAMESPACES(DEFAULT 'http://xxx.OrderRequest/2)') 


SELECT Y.i.value('Status[1]', 'varchar(10)') AS Status 
FROM @doc.nodes('/OrderRequest/MFRRequest') AS Y(i) 

...但我回来了空白。我也尝试过使用OPENXML。我只有空白。我已经尝试了很多这方面的例子,我不知道我错过了什么: -/

我需要撤回MFRRequest,AccountNumber,Status的ID属性,然后将CaseInformation中的几个字段。我将非常感谢任何帮助。非常感谢!

回答

1

三个问题:

  1. 你的命名空间不正确 - 有结尾没有结束括号;命名空间必须被指定为'http://xxx.OrderRequest/2'(不'http://xxx.OrderRequest/2)'

  2. 你错过<OrderRequest><MFRRequest>之间的一个XML元素 - 有在这两个

  3. 一些元素之间的<RequestItems>使用的命名空间 - 一些(像<Status>)唐' - 所以你需要为你的名字空间使用一个XML命名空间前缀来表示哪些元素使用它(哪些不使用)。

所以,如果你使用这个T-SQL代码,而不是 - 它会工作:

;WITH XMLNAMESPACES('http://xxx.OrderRequest/2' AS p) 
SELECT 
    Y.i.value('Status[1]', 'varchar(10)') AS Status 
FROM 
    @doc.nodes('/p:OrderRequest/p:RequestItems/p:MFRRequest') AS Y(i) 
+0

@meowmeow:欢迎您! – 2012-07-26 17:15:18

+0

非常感谢!我讨厌在同一个线程上提出另一个问题,但有什么办法从多个节点中提取数据?我注意到如果我将节点定义为'/ p:OrderRequest/p:RequestItems/p:MFRRequest/p:CaseInformation',Status和AccountNumber变为NULL。这似乎是有道理的。 我需要从MFRRequest以及CaseInformation中提取。我也需要拉财产MFRRequest id =“1”。这是否需要2个不同的查询,然后我必须一起加入数据? – meowmeow 2012-07-26 17:23:11

+0

对不起,我仍然在学习这个网站太哈哈,它不会让我发布回应 - 它只允许我现在发表评论: -/ – meowmeow 2012-07-26 17:24:04