在SQL中读取XML,不提取任何数据

在SQL中读取XML,不提取任何数据,sql,xml,Sql,Xml,我正在尝试从XML文件检索数据。下面是XML文档的外观,下面是我的SQL代码。它将运行代码并显示列标题,但不会填充任何数据。我错过了什么 <profile xmlns="http://feed.elasticstats.com/schema/mma/v1/participants-profile.xsd" generated="2015-12-10T17:34:54Z"> <fighters> <fighter id="01585452-852a-4b40-a6dc

我正在尝试从XML文件检索数据。下面是XML文档的外观,下面是我的SQL代码。它将运行代码并显示列标题,但不会填充任何数据。我错过了什么

<profile xmlns="http://feed.elasticstats.com/schema/mma/v1/participants-profile.xsd" generated="2015-12-10T17:34:54Z">
<fighters>
<fighter id="01585452-852a-4b40-a6dc-fdd04279f02c" height="72" weight="170" reach="" stance="" first_name="Sai" nick_name="The Boss" last_name="Wang">
  <record wins="6" losses="4" draws="1" no_contests="0" />
  <born date="1988-01-16" country_code="UNK" country="Unknown" state="" city="" />
  <out_of country_code="UNK" country="Unknown" state="" city="" />
</fighter>
<fighter id="0168dd6b-b3e1-4954-8b71-877a63772dec" height="" weight="0" reach="" stance="" first_name="Enrique" nick_name="Wasabi" last_name="Marin">
  <record wins="8" losses="2" draws="0" no_contests="0" />
  <born date="" country_code="UNK" country="Unknown" state="" city="" />
  <out_of country_code="UNK" country="Unknown" state="" city="" />
</fighter>

您的XML文档中有一个未声明的命名空间。考虑在XPath表达式中声明命名空间并引用它的修订:

DECLARE @x xml;    
SELECT @x = P
FROM OPENROWSET (BULK 'C:\Python27\outputMMA.xml', SINGLE_BLOB) AS FIGHTERS(P)

DECLARE @hdoc int
EXEC sp_xml_preparedocument @hdoc OUTPUT, @x,
    '<root xmlns:doc="http://feed.elasticstats.com/schema/mma/v1/participants-profile.xsd"/>'

SELECT *
FROM OPENXML (@hdoc, '/doc:profile/doc:fighters/doc:fighter', 1)  
WITH (
      id varchar(100),
      height varchar(10),
      last_name varchar(100)      
     ) 

EXEC sp_xml_removedocument @hdoc
DECLARE@xxml;
选择@x=P
从OPENROWSET(BULK'C:\Python27\outputma.xml',单个\u BLOB)作为战士(P)
声明@hdoc int
EXEC sp_xml_preparedocument@hdoc OUTPUT,@x,
''
挑选*
来自OPENXML(@hdoc,'/doc:profile/doc:fighter/doc:fighter',1)
与(
id varchar(100),
高度varchar(10),
姓氏varchar(100)
) 
EXEC sp_xml_removedocument@hdoc
首先修复数据(
:xs

我们完成了

 01585452-852a-4b40-a6dc-fdd04279f02c   72  Wang
 0168dd6b-b3e1-4954-8b71-877a63772dec       Marin

来自OPENXML的
不再是最好的方法。试着这样做:

只需将其复制到一个空的查询窗口并执行:

DECLARE @xml XML=
'<profile xmlns="http://feed.elasticstats.com/schema/mma/v1/participants-profile.xsd" generated="2015-12-10T17:34:54Z">
  <fighters>
    <fighter id="01585452-852a-4b40-a6dc-fdd04279f02c" height="72" weight="170" reach="" stance="" first_name="Sai" nick_name="The Boss" last_name="Wang">
      <record wins="6" losses="4" draws="1" no_contests="0" />
      <born date="1988-01-16" country_code="UNK" country="Unknown" state="" city="" />
      <out_of country_code="UNK" country="Unknown" state="" city="" />
    </fighter>
    <fighter id="0168dd6b-b3e1-4954-8b71-877a63772dec" height="" weight="0" reach="" stance="" first_name="Enrique" nick_name="Wasabi" last_name="Marin">
      <record wins="8" losses="2" draws="0" no_contests="0" />
      <born date="" country_code="UNK" country="Unknown" state="" city="" />
      <out_of country_code="UNK" country="Unknown" state="" city="" />
    </fighter>
  </fighters>
</profile>';

WITH XMLNAMESPACES(DEFAULT 'http://feed.elasticstats.com/schema/mma/v1/participants-profile.xsd')
SELECT One.fighter.value('@id','uniqueidentifier') AS Fighter_ID
      ,One.fighter.value('@height','int') AS Fighter_Height      
      ,One.fighter.value('@weight','int') AS Fighter_Weigth      
      ,One.fighter.value('@reach','varchar(100)') AS Fighter_Height      
      ,One.fighter.value('@stance','varchar(100)') AS Fighter_Height      
      ,One.fighter.value('@first_name','varchar(100)') AS Fighter_FirstName
      ,One.fighter.value('@nick_name','varchar(100)') AS Fighter_NickName
      ,One.fighter.value('@last_name','varchar(100)') AS Fighter_LastName
      ,One.fighter.value('record[1]/@wins','int') AS FighterRecord_Wins
      ,One.fighter.value('record[1]/@draws','int') AS FighterRecord_Draws
      ,One.fighter.value('record[1]/@no_contests','int') AS FighterRecord_NoContest
      ,One.fighter.value('born[1]/@date','date') AS FighterBorn_Date
      ,One.fighter.value('born[1]/@country_code','varchar(10)') AS FighterBorn_CountryCode
      ,One.fighter.value('born[1]/@country','varchar(100)') AS FighterBorn_Country
      ,One.fighter.value('born[1]/@state','varchar(100)') AS FighterBorn_State
      ,One.fighter.value('born[1]/@city','varchar(100)') AS FighterBorn_City
      ,One.fighter.value('out_of[1]/@country_code','varchar(10)') AS FighterOutOf_CountryCode
      ,One.fighter.value('out_of[1]/@country','varchar(100)') AS FighterOutOf_Country
      ,One.fighter.value('out_of[1]/@state','varchar(100)') AS FighterOutOf_State
      ,One.fighter.value('out_of[1]/@city','varchar(100)') AS FighterOutOf_City
FROM @xml.nodes('/profile/fighters/fighter') AS One(fighter)
DECLARE@xml=
'
';
使用XMLNAMESPACES(默认值'http://feed.elasticstats.com/schema/mma/v1/participants-profile.xsd')
选择一个.fighter.value('@id','uniqueidentifier')作为fighter\u id
,一个.fighter.value(“@height”,“int”)作为fighter\u height
,1.fighter.value(“@weight”,“int”)作为fighter_weight
,一个.fighter.value(“@reach”,“varchar(100)”作为战斗机的高度
,一个.fighter.value(“@stance”,“varchar(100)”作为战斗机的高度
,一个.fighter.value(“@first_name”,“varchar(100)”作为fighter_FirstName
,一个.fighter.value(“@nick_name”,“varchar(100)”作为fighter_的昵称
,一个.fighter.value(“@last_name”,“varchar(100)”作为fighter_LastName
,一个.fighter.value('record[1]/@wins','int')作为FighterRecord\u的胜利
,一个.fighter.value('record[1]/@draws','int')作为FighterRecord\u绘制
,One.fighter.value('record[1]/@no_contents','int')作为FighterRecord_NoContest
,One.fighter.value('born[1]/@date','date')作为FighterBorn\u日期
,One.fighter.value('born[1]/@country_code','varchar(10)'作为FighterBorn_country code
,一个。fighter。value('born[1]/@country','varchar(100)')作为FighterBorn_country
,一个.fighter.value('born[1]/@state','varchar(100)')作为FighterBorn_state
,一个.fighter.value('born[1]/@city','varchar(100)')作为FighterBorn_city
,One.fighter.value('out_of[1]/@country_code','varchar(10)')作为FightRoutof_country code
,一个.fighter.value('out_of[1]/@country','varchar(100)')作为fighterroutof_country
,一个.fighter.value('out_of[1]/@state','varchar(100)')作为fighterroutof_state
,One.fighter.value('out_of[1]/@city','varchar(100)')作为fighterroutof_city
从@xml.nodes('/profile/fighter/fighter')作为一个(fighter)

我只复制了文件的顶部-因此答案是“:xs”。谢谢这会做什么?为什么会丢失它呢???@Jason Vondersmith,XML文档可以有未声明的名称空间。您没有键入任何错误,您的文档也没有错误。
来自OPENXML
已被弃用,仅在非常特殊的性能相关情况下才应考虑……
对于OPENXML
请参见我的答案如何使用今天的方法……
来自OPENXML
已弃用,只应在非常特殊的情况下考虑与性能相关的情况…考虑将解决方案从查询中声明的XML字符串更改为OP最初设置的文件解析。
FROM OPENXML (@docHandle, 'profile/fighters/fighter', 1)
 01585452-852a-4b40-a6dc-fdd04279f02c   72  Wang
 0168dd6b-b3e1-4954-8b71-877a63772dec       Marin
DECLARE @xml XML=
'<profile xmlns="http://feed.elasticstats.com/schema/mma/v1/participants-profile.xsd" generated="2015-12-10T17:34:54Z">
  <fighters>
    <fighter id="01585452-852a-4b40-a6dc-fdd04279f02c" height="72" weight="170" reach="" stance="" first_name="Sai" nick_name="The Boss" last_name="Wang">
      <record wins="6" losses="4" draws="1" no_contests="0" />
      <born date="1988-01-16" country_code="UNK" country="Unknown" state="" city="" />
      <out_of country_code="UNK" country="Unknown" state="" city="" />
    </fighter>
    <fighter id="0168dd6b-b3e1-4954-8b71-877a63772dec" height="" weight="0" reach="" stance="" first_name="Enrique" nick_name="Wasabi" last_name="Marin">
      <record wins="8" losses="2" draws="0" no_contests="0" />
      <born date="" country_code="UNK" country="Unknown" state="" city="" />
      <out_of country_code="UNK" country="Unknown" state="" city="" />
    </fighter>
  </fighters>
</profile>';

WITH XMLNAMESPACES(DEFAULT 'http://feed.elasticstats.com/schema/mma/v1/participants-profile.xsd')
SELECT One.fighter.value('@id','uniqueidentifier') AS Fighter_ID
      ,One.fighter.value('@height','int') AS Fighter_Height      
      ,One.fighter.value('@weight','int') AS Fighter_Weigth      
      ,One.fighter.value('@reach','varchar(100)') AS Fighter_Height      
      ,One.fighter.value('@stance','varchar(100)') AS Fighter_Height      
      ,One.fighter.value('@first_name','varchar(100)') AS Fighter_FirstName
      ,One.fighter.value('@nick_name','varchar(100)') AS Fighter_NickName
      ,One.fighter.value('@last_name','varchar(100)') AS Fighter_LastName
      ,One.fighter.value('record[1]/@wins','int') AS FighterRecord_Wins
      ,One.fighter.value('record[1]/@draws','int') AS FighterRecord_Draws
      ,One.fighter.value('record[1]/@no_contests','int') AS FighterRecord_NoContest
      ,One.fighter.value('born[1]/@date','date') AS FighterBorn_Date
      ,One.fighter.value('born[1]/@country_code','varchar(10)') AS FighterBorn_CountryCode
      ,One.fighter.value('born[1]/@country','varchar(100)') AS FighterBorn_Country
      ,One.fighter.value('born[1]/@state','varchar(100)') AS FighterBorn_State
      ,One.fighter.value('born[1]/@city','varchar(100)') AS FighterBorn_City
      ,One.fighter.value('out_of[1]/@country_code','varchar(10)') AS FighterOutOf_CountryCode
      ,One.fighter.value('out_of[1]/@country','varchar(100)') AS FighterOutOf_Country
      ,One.fighter.value('out_of[1]/@state','varchar(100)') AS FighterOutOf_State
      ,One.fighter.value('out_of[1]/@city','varchar(100)') AS FighterOutOf_City
FROM @xml.nodes('/profile/fighters/fighter') AS One(fighter)