我有以下查询,其中我从表中为@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)
答案 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)