从具有多个名称空间的XML值中创建条件

问题描述 投票:1回答:2

我正在寻找从XML返回where条件的值。我想从消息表的请求返回一个。这是XML数据格式。不幸的是,我无能为力。然后,我尝试将值放在一列中,但是我总是得到null值

这里是来自“请求”列的XML:

<InvoiceRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/InternalReuqests">
  <ActiveUserID xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">0</ActiveUserID>
  <LinqConfigId xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">0</LinqConfigId>
  <RequestHeaderInfo xmlns:d2p1="Fix.Services" xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">
    <d2p1:MapArchive i:nil="true" />
    <d2p1:HandledSuccessCategory>rscNone</d2p1:HandledSuccessCategory>
  </RequestHeaderInfo>
  <Username xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase" i:nil="true" />
  <SSID>S-1-6-25-123456789-123456789-123456789-12345</SSID>
  <miscdata xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <d2p1:string>date:2020.02.26 08:27:00</d2p1:string>
    <d2p1:string>hours:0</d2p1:string>
    <d2p1:string>Ready:True</d2p1:string>
    <d2p1:string>disct:False</d2p1:string>
    <d2p1:string>extdisct:False</d2p1:string>
    <d2p1:string>Matmove:False</d2p1:string>
    <d2p1:string>Matlim:0</d2p1:string>
    <d2p1:string>Comments:</d2p1:string>
  </miscdata>
  <ffreeID>468545</ffreeID>
</InvoiceRequest>

这是我的SQL查询:

   select id, Request.value('(/*:InvoiceRequest/*:ffreeID)[1]','varchar(max)')
     from messages

我以为我应该在第一列中获取数据库的ID,并在其旁边获取ffreeID的值,但Request.value始终为null。

有人可以调查一下我想念的是什么吗?

sql-server xml xquery
2个回答
0
投票

您需要声明默认的名称空间,对于您的xml来说是http://schemas.datacontract.org/2004/07/InternalReuqests

--Sample XML
DECLARE @xml xml = '<InvoiceRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/InternalReuqests">
  <ActiveUserID xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">0</ActiveUserID>
  <LinqConfigId xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">0</LinqConfigId>
  <RequestHeaderInfo xmlns:d2p1="Fix.Services" xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">
    <d2p1:MapArchive i:nil="true" />
    <d2p1:HandledSuccessCategory>rscNone</d2p1:HandledSuccessCategory>
  </RequestHeaderInfo>
  <Username xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase" i:nil="true" />
  <SSID>S-1-6-25-123456789-123456789-123456789-12345</SSID>
  <miscdata xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <d2p1:string>date:2020.02.26 08:27:00</d2p1:string>
    <d2p1:string>hours:0</d2p1:string>
    <d2p1:string>Ready:True</d2p1:string>
    <d2p1:string>disct:False</d2p1:string>
    <d2p1:string>extdisct:False</d2p1:string>
    <d2p1:string>Matmove:False</d2p1:string>
    <d2p1:string>Matlim:0</d2p1:string>
    <d2p1:string>Comments:</d2p1:string>
  </miscdata>
  <ffreeID>468545</ffreeID>
</InvoiceRequest>'; --Assumed this should be </InvoiceRequest>, not <InvoiceRequest>.

--Get value
WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/InternalReuqests')
SELECT X.Request.value('(/InvoiceRequest/ffreeID/text())[1]','int')
FROM (VALUES(@XML))X(Request);

0
投票

这里是模拟模拟表的另一种方法。其他一切都类似于@Larnu的解决方案。所有功劳归@Larnu。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Request XML);
INSERT INTO @tbl (Request)
VALUES
(N'<InvoiceRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
                xmlns="http://schemas.datacontract.org/2004/07/InternalReuqests">
    <ActiveUserID xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">0</ActiveUserID>
    <LinqConfigId xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">0</LinqConfigId>
    <RequestHeaderInfo xmlns:d2p1="Fix.Services"
                       xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">
        <d2p1:MapArchive i:nil="true"/>
        <d2p1:HandledSuccessCategory>rscNone</d2p1:HandledSuccessCategory>
    </RequestHeaderInfo>
    <Username xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase" i:nil="true"/>
    <SSID>S-1-6-25-123456789-123456789-123456789-12345</SSID>
    <miscdata xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <d2p1:string>date:2020.02.26 08:27:00</d2p1:string>
        <d2p1:string>hours:0</d2p1:string>
        <d2p1:string>Ready:True</d2p1:string>
        <d2p1:string>disct:False</d2p1:string>
        <d2p1:string>extdisct:False</d2p1:string>
        <d2p1:string>Matmove:False</d2p1:string>
        <d2p1:string>Matlim:0</d2p1:string>
        <d2p1:string>Comments:</d2p1:string>
    </miscdata>
    <ffreeID>468545</ffreeID>
</InvoiceRequest>');
-- DDL and sample data population, end

WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/InternalReuqests')
SELECT ID
    , c.value('(ffreeID/text())[1]','INT') AS ffreeID
FROM @tbl AS tbl
    CROSS APPLY tbl.Request.nodes('/InvoiceRequest') AS t(c);

输出

+----+---------+
| ID | ffreeID |
+----+---------+
|  1 |  468545 |
+----+---------+
© www.soinside.com 2019 - 2024. All rights reserved.