Sql server XML列-在xmlColumn.value()中使用“with namespace”

Sql server XML列-在xmlColumn.value()中使用“with namespace”,sql-server,xml,tsql,xquery,Sql Server,Xml,Tsql,Xquery,我正在尝试创建一个演示名称空间的课程。 我的数据库中有一个XML列,其中包含一个FlighReservations根,具有多个FlighReservation元素。每个FlightReservation类似于一行,并具有我希望显示为列的各种子元素。我可以在不使用名称空间的情况下实现这一点,现在我想使用名称空间前缀来实现这一点 我这里有一个可复制的样本: 这是T-SQL: DECLARE @xmlDoc XML = '<ns0:FlightReservations xmlns:ns0="

我正在尝试创建一个演示名称空间的课程。 我的数据库中有一个XML列,其中包含一个FlighReservations根,具有多个FlighReservation元素。每个FlightReservation类似于一行,并具有我希望显示为列的各种子元素。我可以在不使用名称空间的情况下实现这一点,现在我想使用名称空间前缀来实现这一点

我这里有一个可复制的样本:

这是T-SQL:

DECLARE @xmlDoc XML = 
 '<ns0:FlightReservations xmlns:ns0="http://SchemaLesson.FlightReservations">
  <ns1:FlightReservation xmlns:ns1="http://SchemaLesson.FlightReservation">
    <DepartureAirportCode>DFW</DepartureAirportCode>"
  </ns1:FlightReservation>
  <ns1:FlightReservation xmlns:ns1="http://SchemaLesson.FlightReservation">
    <DepartureAirportCode>OKC</DepartureAirportCode>"
  </ns1:FlightReservation>
  </ns0:FlightReservations>
'
;

WITH XMLNAMESPACES ('http://SchemaLesson.FlightReservations' as ns0, 
                    'http://SchemaLesson.FlightReservation' as ns1, 
                    DEFAULT 'http://SchemaLesson.FlightReservation'
                    )
select 
    t2.xmlDoc2.query('.') AS result  , 
    t2.xmlDoc2.value('(.//*[local-name()="DepartureAirportCode"])[1]','varchar(5)') AS DepartureAirportCode1, 
    t2.xmlDoc2.value('(./ns1:FlightReservation/DepartureAirportCode)[1]', 'varchar(5)') AS DepartureAirportCode2, 
    t2.xmlDoc2.value('(.//ns1:FlightReservation/DepartureAirportCode)[1]', 'varchar(5)') AS DepartureAirportCode3, 
    t2.xmlDoc2.value('(.//DepartureAirportCode)[1]', 'varchar(5)') AS DepartureAirportCode4, 
    t2.xmlDoc2.value('(.//ns1:DepartureAirportCode)[1]', 'varchar(5)') AS DepartureAirportCode5 
    from @xmlDoc.nodes('//ns1:FlightReservation')  AS t2(xmlDoc2) 
from语句似乎正在工作,因为我得到了两行输出,结果列设置为this,带有一个或另一个机场代码:

<ns1:FlightReservation xmlns:ns1="http://SchemaLesson.FlightReservation">
  <DepartureAirportCode>DFW</DepartureAirportCode>"
</ns1:FlightReservation>
我可以使用XpathTester.com单独测试我的XPath:

SQL 2019中显示的结果是:

唯一有效的方法是使用local name函数,演示的目的是使用ns1前缀。也许我有一个打字错误,但我已经盯着它试了一段时间,却看不见它。with命名空间设置是否也应该在.value子句中工作


Microsoft SQL Server 2019 RTM-15.0.2000.5 X64 2019年9月24日13:48:23版权所有C 2019 Microsoft Corporation Developer Edition 64位Windows Server 2019标准10.0版本17763:

请查看下面的T-SQL

XML只有两个名称空间,而不是三个。我调整了.nodes方法XPath表达式。具有NULL值的列在.value方法中的XPath有问题

SQL

输出


请共享所需的输出。出发机场代码1和出发机场代码5之间有什么区别?谢谢。是的,这是一个额外的默认名称空间问题。我不明白为什么DepartureAirportCode/text[1]适用于DepartureAirportCode2。这在XPathTester中对结果列中的内容不起作用。为什么不可以。/ns1:FlightReservation/DepartureAirportCode[1]?我以为你必须指定一个。在开始使用交叉点的结果时,应用或nodes@NealWalters,1名XPath测试人员,我们不知道它背后是什么引擎。2不需要,ns1不需要:航班预订。上下文已经在该元素下面。
DECLARE @xmlDoc XML = 
 '<ns0:FlightReservations xmlns:ns0="http://SchemaLesson.FlightReservations">
  <ns1:FlightReservation xmlns:ns1="http://SchemaLesson.FlightReservation">
    <DepartureAirportCode>DFW</DepartureAirportCode>"
  </ns1:FlightReservation>
  <ns1:FlightReservation xmlns:ns1="http://SchemaLesson.FlightReservation">
    <DepartureAirportCode>OKC</DepartureAirportCode>"
  </ns1:FlightReservation>
  </ns0:FlightReservations>';

WITH XMLNAMESPACES ('http://SchemaLesson.FlightReservations' as ns0
    , 'http://SchemaLesson.FlightReservation' as ns1)
select c.query('.') AS result  , 
    c.value('(.//*[local-name()="DepartureAirportCode"])[1]','varchar(5)') AS DepartureAirportCode1, 
    c.value('(DepartureAirportCode/text())[1]', 'varchar(5)') AS DepartureAirportCode2, 
    c.value('(.//ns1:FlightReservation/DepartureAirportCode)[1]', 'varchar(5)') AS DepartureAirportCode3, 
    c.value('(.//DepartureAirportCode)[1]', 'varchar(5)') AS DepartureAirportCode4, 
    c.value('(.//ns1:DepartureAirportCode)[1]', 'varchar(5)') AS DepartureAirportCode5 
from @xmlDoc.nodes('/ns0:FlightReservations/ns1:FlightReservation')  AS t(c);
+----------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
|                                                           result                                                           | DepartureAirportCode1 | DepartureAirportCode2 | DepartureAirportCode3 | DepartureAirportCode4 | DepartureAirportCode5 |
+----------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
| <ns1:FlightReservation xmlns:ns1="http://SchemaLesson.FlightReservation"><DepartureAirportCode>DFW</DepartureAirportCode>" |                       |                       |                       |                       |                       |
|   </ns1:FlightReservation>                                                                                                 | DFW                   | DFW                   | NULL                  | DFW                   | NULL                  |
| <ns1:FlightReservation xmlns:ns1="http://SchemaLesson.FlightReservation"><DepartureAirportCode>OKC</DepartureAirportCode>" |                       |                       |                       |                       |                       |
|   </ns1:FlightReservation>                                                                                                 | OKC                   | OKC                   | NULL                  | OKC                   | NULL                  |
+----------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+