我的Xquery结果一直空白

时间:2014-05-22 08:56:56

标签: xml tsql xquery

我有以下查询,其中我从表中为@input变量分配xml列。我忽略了命名空间,但我没有得到任何结果.....有人可以帮忙吗?

这是示例Xml,然后是查询......

<?xml version="1.0" encoding="UTF-8"?>
-<FIXML xmlns="http://www.fixprotocol.org/FIXML-4-4"xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">-
<Batch>-
<AllocInstrctn PosEfct="C" NetMny="000000" BkngTyp="0" SettlDt="2014-05-15" SettlTyp="0"TxnTm="2014-05-15T10:53:28+01:00" TrdDt="2014-05-15" Ccy="GBP" AvgPx="0" PxTyp="9" OrignDt="2014-05-15" QtyTyp="0" Qty="0000000" Side="2" NoOrdsTyp="1" LinkTyp="1" LinkID="0000000SE" ID2="1000000" Typ="1" TransTyp="0" ID="0000000"><Hdr TID="HSS" SID="AER_TFOLIO"/>
</AllocInstrctn>
</Batch>
</FIXML>


declare @Trade_Ref nvarchar(12)

select  @Trade_Ref = 'XYZ'

declare @input xml =    (
    select  FIXML_Data
    from    dbo.OTC_FIXML_Data
    where   TradeRef = @Trade_Ref
    )
;with XMLNAMESPACES(DEFAULT 'http://')                      
SELECT  @input.value('TrdDt[1]', 'datetime') 
FROM    @input.nodes('/Batch/AllocInstrctn') AS rep(AllocInstrctn)

3 个答案:

答案 0 :(得分:1)

试试这个:

;WITH XMLNAMESPACES(DEFAULT 'http://www.fixprotocol.org/FIXML-4-4') 
SELECT  @input.value('(/FIXML/Batch/AllocInstrctn/@TrdDt)[1]', 'datetime')

答案 1 :(得分:0)

您不能通过在数据中声明它来忽略命名空间。要么在查询中忽略它,要么声明并使用它。使用通配符名称空间*

可以忽略
/*:Batch/*:AllocInstrctn

此外,您似乎省略了最外层的XML节点<FIXML/>

/*:FIXML/*:Batch/*:AllocInstrctn

无论如何,您的XML格式不正确,因为根元素可能不在(其中)文本节点之前(-可能不在那里)。也许SQL Server能够处理这个问题,但是如果这真的是你必须处理的内容,你应该向发送数据的人抱怨。

答案 2 :(得分:0)

我尝试使用它,看看它是否有帮助

Declare @xml XML
SET @xml = N'
<FIXML>
<Batch>
<AllocInstrctn PosEfct="C" NetMny="000000" BkngTyp="0" SettlDt="2014-05-15" SettlTyp="0" TxnTm="2014-05-15T10:53:28+01:00" TrdDt="2014-05-15" Ccy="GBP" AvgPx="0" PxTyp="9" OrignDt="2014-05-15" QtyTyp="0" Qty="0000000" Side="2" NoOrdsTyp="1" LinkTyp="1" LinkID="0000000SE" ID2="1000000" Typ="1" TransTyp="0" ID="0000000"><Hdr TID="HSS" SID="AER_TFOLIO"/>
</AllocInstrctn>
</Batch>
</FIXML>'
SELECT T.Item.value('@PosEfct', 'VARCHAR(50)') PosEfct,
        T.Item.value('@TrdDt', 'DATETIME') TrdDt
 FROM @xml.nodes('/FIXML/Batch/AllocInstrctn') AS T(Item)