简单的xml.nodes t-sql查询不起作用
福尔克斯,这里是xml:简单的xml.nodes t-sql查询不起作用,xml,tsql,xpath,xquery,xml-namespaces,Xml,Tsql,Xpath,Xquery,Xml Namespaces,福尔克斯,这里是xml: declare @xml xml = Cast('<asset_market_data_response xmlns="http://schemas.bcs.ru/marketing_data_service/in/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <system_block xm
declare @xml xml =
Cast('<asset_market_data_response xmlns="http://schemas.bcs.ru/marketing_data_service/in/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<system_block xmlns="http://schemas.bcs.ru/is/clipboard/">
<originator>Bloomberg</originator>
<mean_for>IS.Clipboard</mean_for>
<document_id>e7aa2033-0a53-4390-a09b-504673ea54bb</document_id>
<event>New</event>
<event_time>2017-11-23T13:35:49.171696+03:00</event_time>
</system_block>
<common_block>
<request_id>603bc973-39d0-e711-9417-984be16869ec</request_id>
</common_block>
<body>
<date_request>2017-11-22T00:00:00</date_request>
<data_request_code>bloomberg_bond</data_request_code>
<data_source_code>Bloomberg</data_source_code>
<data_version xsi:nil="true" />
<error_message_source xsi:nil="true" />
<asset_list>
<asset>
<common>
<identifier>XS0114288789</identifier>
<trading_floor_code xsi:nil="true" />
<trading_floor_section_code>Equity</trading_floor_section_code>
<trading_floor_board_code xsi:nil="true" />
</common>
<data_list>
<data>
<name>CRNCY</name>
<value>USD</value>
</data>
<data>
<name>PAR_AMT</name>
<value>.475000000</value>
</data>
</data_list>
</asset>
<asset>
<common>
<identifier>CH0385518086</identifier>
<trading_floor_code xsi:nil="true" />
<trading_floor_section_code>Equity</trading_floor_section_code>
<trading_floor_board_code xsi:nil="true" />
</common>
<data_list>
<data>
<name>CRNCY</name>
<value>CHF</value>
</data>
<data>
<name>PAR_AMT</name>
<value>5000.000000000</value>
</data>
</data_list>
</asset>
</asset_list>
</body>
</asset_market_data_response>' as xml)
但是它没有输出(列名称'identifier'&没有行)。我需要的是:
我的选择有什么问题?这很简单,我不知道哪里出了问题。可能是,xml本身存在一些问题?发现xml本身存在问题。已删除以“/>”结尾的节点+xml架构引用:
set @chr = Replace(
Replace(
Replace(
Replace(
Replace(
Replace(
Replace(@chr, ' xmlns="http://schemas.bcs.ru/marketing_data_service/in/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"', ''),
' xmlns="http://schemas.bcs.ru/is/clipboard/"', ''),
'<data_version xsi:nil="true" />', ''),
'<error_message_source xsi:nil="true" />', ''),
'<trading_floor_code xsi:nil="true" />', ''),
'<trading_floor_board_code xsi:nil="true" />', ''),
'<value xsi:nil="true" />', '<value></value>')
这也有效:
select t.c.value('identifier[1]', 'varchar(50)') as identifier
from @xml.nodes('asset_market_data_response/body/asset_list/asset/common') t(c)
这也是:
select t.c.query('./identifier').value('.', 'varchar(50)') as identifier
from @xml.nodes('asset_market_data_response/body/asset_list/asset/common') t(c)
不,您不应该使用字符串方法来修复XML,这完全可以 您只需声明所涉及的名称空间:
WITH XMLNAMESPACES(DEFAULT 'http://schemas.bcs.ru/marketing_data_service/in/')
select c.value('(identifier/text())[1]', 'varchar(50)') as identifier
from @xml.nodes('asset_market_data_response/body/asset_list/asset/common') t(c);
名称空间声明有帮助!而且不需要那些“修理”的东西。谢谢你,Shnugo,太棒了!
select t.c.value('identifier[1]', 'varchar(50)') as identifier
from @xml.nodes('asset_market_data_response/body/asset_list/asset/common') t(c)
select t.c.query('./identifier').value('.', 'varchar(50)') as identifier
from @xml.nodes('asset_market_data_response/body/asset_list/asset/common') t(c)
WITH XMLNAMESPACES(DEFAULT 'http://schemas.bcs.ru/marketing_data_service/in/')
select c.value('(identifier/text())[1]', 'varchar(50)') as identifier
from @xml.nodes('asset_market_data_response/body/asset_list/asset/common') t(c);