如何在创建SQL请求时忽略XML命名空间?

时间:2013-12-13 15:11:04

标签: sql sql-server xml

我在DB中有很多行包含XML数据字段。 XML大致如下所示:

    <CabasEstimateReply xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://cabmb.cab.se/schemas/CABMBGeneralSchemas/CABASEstimateReply/2006-11-16/">
  <Estimate xmlns="">
    <WorkshopCompanyId>C002006893</WorkshopCompanyId>
    <EstimateId>1-SE-AEB965-634921885183891313</EstimateId>
  </Estimate>
  <EstimateReply xmlns="">
    **<EstimateReplyCode>ReplyStatus1</EstimateReplyCode>**
    <EstimateReplyVersion>1</EstimateReplyVersion>
    <EstimateReplyDate>2013-05-31T11:40:18.6227322+03:00</EstimateReplyDate>
    <EstimateReplyComment />
    <EstimateReplyMessage>Kunden betalar :                   8692    Fakturaadress :                    Trygg Hansa</EstimateReplyMessage>
    <EstimateReplyMessageCompressMethod />
    <EstimateReplyReference>010704</EstimateReplyReference>
    <EstimateReplyForthcomingInspectionDate />
  </EstimateReply>
  <Vehicle xmlns="">
    <VehicleRegNo>XND108</VehicleRegNo>
    <VehicleMake>BMW</VehicleMake>
    <VehicleModel>525I TOURING</VehicleModel>
    <VehicleModelYear />
    <VehicleModelMonth />
    <VehicleVINCode />
    <VehicleChassiNo>NL51010CM95684</VehicleChassiNo>
    <VehicleFirstRegistered>2006-02-23T00:00:00</VehicleFirstRegistered>
    <Imported>null</Imported>
  </Vehicle>

我需要通过SQL请求获得值EstimateReplyCode(用粗体标记)。我这样做:

 ;WITH XMLNAMESPACES(DEFAULT 'https://cabmb.cab.se/schemas/CABMBGeneralSchemas/CABASEstimateReply/2006-11-16/')
select [Data],
Data.value('(/CabasEstimateReply/EstimateReply/EstimateReplyCode)[1]', 'nvarchar(64)') AS ReplyCode
from EstimateReplyRawData

但只为ReplyCode获取空值。当我尝试将XML转换为字符串,然后替换命名空间然后转换为XML,一切运行良好,这就是为什么我认为问题是命名空间。我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

如果您确实要忽略名称空间,可以使用名称空间通配符。

select [Data],
Data.value('(/*:CabasEstimateReply/*:EstimateReply/*:EstimateReplyCode)[1]', 'nvarchar(64)') AS ReplyCode
from EstimateReplyRawData