2015-02-04 2 views
1

Я пытаюсь запросить некоторые данные XML, которые были отправлены. Я следовал различным примерам, но не могу даже адресовать ни один из элементов под корнем. Я не уверен, что мне не хватает. Я пробовал просто потянуть xml под /KitchenSupply/StoreInfo и ничего. Является ли пространство имен виновным, что я ничего не могу вернуть?Запрос XML в SQL Server с пространством имен

declare @myxmlinv as xml = 
'<?xml version="1.0" encoding="utf-8"?> 
<KitchenSupply xmlns="http://www.starstandards.org/STAR" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="KitchenSupply.xsd"> 
    <StoreInfo> 
    <RCPT> 
     <SubTaskCode>ZZZ</SubTaskCode> 
     <SubComponentCode>BS1</SubComponentCode> 
     <StoreNumber>2241</StoreNumber> 
     <USRegionNumber>SE</USRegionNumber> 
    </RCPT> 
    <SentDateTime>02/04/2015</SentDateTime> 
    <IntId>ABC1234587</IntId> 
    <Destinations> 
     <DestinationFormatType>KS_XML_v3</DestinationFormatType> 
    </Destinations> 
    </StoreInfo> 
    <KitchenOrder> 
    <KsRecord SalesTransactionPayType="CC" SalesTransactionType="Closed"> 
     <ReceiptAmt RcptTotalAmt="0.00" CustRcptTotalAmt="25.22" CCPostDate="01/07/2015" InvoiceDate="01/05/2015" CustName="JOHN SMITH" CustNo="13998" RcptNo="78476221" /> 
     <KsCosts> 
     <SaleAmts UnitCost="15.00" TxblAmt="15.00" PayType="Cust" /> 
     <SalesInfo JobStatus="F" JobNo="1" ItemCode="HT093" ItemDesc="Hand Towel"> 
      <EmpInfo EmpRate="16.00" EmpCommPct="1.2" EmpName="DOUG ROGERS" EmpNo="998331" /> 
     </SalesInfo> 
     </KsCosts> 
    </KsRecord> 
    <CustomerRecord> 
     <ContactInfo LastName="SMITH" FreqFlag="Y"> 
     <Address Zip="90210" State="CA" City="BEV" Addr1="123 MAIN ST" Type="Business" /> 
     <Email MailTo="[email protected]" /> 
     <Phone Num="1235551212" Type="H" /> 
     <Phone Num="1235551213" Type="B" /> 
     </ContactInfo> 
    </CustomerRecord> 
    </KitchenOrder> 
    <KitchenOrder> 
    <KsRecord SalesTransactionPayType="CC" SalesTransactionType="Closed"> 
     <ReceiptAmt RcptTotalAmt="0.00" CustRcptTotalAmt="5.71" CCPostDate="01/08/2015" InvoiceDate="01/07/2015" CustName="SARAH BALDWIN" CustNo="14421" RcptNo="78476242" /> 
     <KsCosts> 
     <SaleAmts UnitCost="2.00" TxblAmt="2.00" PayType="Cust" /> 
     <SalesInfo JobStatus="F" JobNo="1" ItemCode="HS044" ItemDesc="Hand Soap"> 
      <EmpInfo EmpRate="16.00" EmpCommPct="1.2" EmpName="DOUG ROGERS" EmpNo="998331" /> 
     </SalesInfo> 
     </KsCosts> 
    </KsRecord> 
    <CustomerRecord> 
     <ContactInfo LastName="BALDWIN" FreqFlag="N"> 
     <Address Zip="90210" State="CA" City="BEV" Addr1="123 VINE ST" Type="Home" /> 
     <Email MailTo="[email protected]" /> 
     <Phone Num="1235555512" Type="H" /> 
     <Phone Num="1235556613" Type="M" /> 
     </ContactInfo> 
    </CustomerRecord> 
    </KitchenOrder> 
</KitchenSupply>'; 


declare @myxmlinv_table as table (
row_id tinyint, 
inv_xml xml 
); 

insert into @myxmlinv_table(row_id,inv_xml) values('1',@myxmlinv); 

Отобразите XML документ и тянуть столбец IntId: (не работает)

select i.row_id, i.inv_xml, i.inv_xml.value('(/KitchenSupply/StoreInfo/IntId)[1]','varchar(255)') as data_description 
from @myxmlinv_table i 

Попытка использовать XMLNAMESPACES для отображения документа XML на уровне StoreInfo: (также не работает)

WITH XMLNAMESPACES ('http://www.starstandards.org/STAR' as ks) 
SELECT 
    XmlCol.query('/ks:KitchenSupply/StoreInfo') 
FROM T; 

В идеале, я хотел бы использовать узлы для извлечения всех данных и для разделения таблиц для запросов.

KitchenOrders все в одной таблице, CustomerRecord в другой и т.д.

Любые идеи?

ответ

1

Вы должны использовать что-то вроде этого:

-- define the XML namespace as the "default" so you don't have to 
-- prefix each and every XPath element with the XML namespace prefix 
WITH XMLNAMESPACES(DEFAULT 'http://www.starstandards.org/STAR') 
SELECT 
    -- reach into the <KsRecord> subnode under <KitchenOrder> 
    ReceiptNo = XC.value('(KsRecord/ReceiptAmt/@RcptNo)[1]', 'int'), 
    CustName = XC.value('(KsRecord/ReceiptAmt/@CustName)[1]', 'varchar(25)'), 
    -- reach into the <CustomerRecord> subnode under <KitchenOrder>  
    CustomerLastName = xc.value('(CustomerRecord/ContactInfo/@LastName)[1]', 'varchar(50)'), 
    CustomerEmail = xc.value('(CustomerRecord/ContactInfo/Email/@MailTo)[1]', 'varchar(50)') 
FROM 
    -- get a "virtual" table of XML fragments, one for each <KitchenOrder> node 
    @myxmlinv.nodes('/KitchenSupply/KitchenOrder') AS XT(XC) 
+0

Выглядит и отлично работает! Благодарю вас, надеюсь, я смогу расширить это. – user2162331

1

Да, это пространство имен. Чтобы заставить SQL Server игнорировать пространство имен, вы можете использовать локальное имя:

SELECT * 
FROM @myxmlinv_table 
WHERE inv_xml.exist('//*[local-name()="KitchenSupply"]') = 1 
Смежные вопросы