【问题标题】:Parsing XML Data Into SQL Server将 XML 数据解析到 SQL Server
【发布时间】:2021-11-04 14:55:34
【问题描述】:

我在将 XML 数据导入 SQL Server 2016 时遇到了困难。我尝试了一些方法,但要么一直出错,要么就是没有返回数据。

我将此 XML 数据存储在一个 XML 文件中(限制数据,因为它非常敏感:

<?xml version='1.0' encoding='UTF-8'?>
<wd:Report_Data xmlns:wd="urn:com.workday.report/Worker_Details_-_EXPORT_-_Workplace">
    <wd:Report_Entry>
        <wd:Active_Status>0</wd:Active_Status>
        <wd:Legal_Name_-_First_Name>Charlotte</wd:Legal_Name_-_First_Name>
        <wd:Position>Executive Housekeeper I</wd:Position>
        <wd:Worker_Management_Level>Supervisor</wd:Worker_Management_Level>
        <wd:continuous_service_date>1979-04-29-08:00</wd:continuous_service_date>
        <wd:Hire_Date>1979-04-29-08:00</wd:Hire_Date>
        <wd:termination_date>2019-12-22-08:00</wd:termination_date>
        <wd:Anniversary_Month>04</wd:Anniversary_Month>
        <wd:Years_of_Service>40</wd:Years_of_Service>
        <wd:Employee_Type>Hotel</wd:Employee_Type>
        <wd:Time_Type>Full Time</wd:Time_Type>
        <wd:Pay_Rate_Type>Salary</wd:Pay_Rate_Type>
        <wd:Marital_Status>Single</wd:Marital_Status>
    </wd:Report_Entry>
    <wd:Report_Entry>
        <wd:Active_Status>0</wd:Active_Status>
        <wd:Legal_Name_-_First_Name>Robert</wd:Legal_Name_-_First_Name>
        <wd:Cost_Center_-_Name>Electronics</wd:Cost_Center_-_Name>
        <wd:Work_Address_-_State_Province>Missouri</wd:Work_Address_-_State_Province>
        <wd:Position>Manager Of Voice Networks</wd:Position>
        <wd:Worker_Management_Level>Manager</wd:Worker_Management_Level>
        <wd:continuous_service_date>1980-02-25-08:00</wd:continuous_service_date>
        <wd:Hire_Date>1980-02-25-08:00</wd:Hire_Date>
        <wd:termination_date>2020-03-22-07:00</wd:termination_date>
        <wd:Anniversary_Month>02</wd:Anniversary_Month>
        <wd:Years_of_Service>40</wd:Years_of_Service>
        <wd:Employee_Type>Corporate</wd:Employee_Type>
        <wd:Time_Type>Full Time</wd:Time_Type>
        <wd:Pay_Rate_Type>Salary</wd:Pay_Rate_Type>
        <wd:Marital_Status>Married</wd:Marital_Status>
    </wd:Report_Entry>
</wd:Report_Data>

我有这段代码,我正在尝试使用,但总是得到一个空结果:

SELECT  
    XMLCol.ReportEntry.query('Active_Status').value('.', 'VARCHAR(20)') AS ActiveStatus
FROM
    (SELECT 
         CAST(XMLCol AS XML)
     FROM 
         OPENROWSET(BULK '\\afcn2011\root\DATA\VisualCron\Employee Export\EmployeeExport.xml', SINGLE_BLOB) AS T(XMLCol)
    ) AS T(XMLCol)
CROSS APPLY 
    XMLCol.nodes('Report_Data/Report_Entry') AS XMLCol(ReportEntry);

【问题讨论】:

  • 因为您忽略了 XML 命名空间。
  • 在 xml 命名空间上查看 the doc

标签: sql sql-server xml


【解决方案1】:

您需要尊重并包含​​文档中定义的 XML 命名空间。

试试这样的:

-- define the namespace and give it a prefix - here "wd"
;WITH XMLNAMESPACES ('urn:com.workday.report/Worker_Details_-_EXPORT_-_Workplace' as wd)
SELECT  
    -- you need to include namespace prefix when referring to the XML element
    -- also: is "VARCHAR(20)" really the best datatype?? Looks more like "INT" to me ...
    XMLCol.ReportEntry.value('(wd:Active_Status/text())[1]', 'VARCHAR(20)') AS ActiveStatus
FROM
    (SELECT 
         CAST(XMLCol AS XML)
     FROM 
         OPENROWSET(BULK '\\afcn2011\root\DATA\VisualCron\Employee Export\EmployeeExport.xml', SINGLE_BLOB) AS T(XMLCol)
    ) AS T(XMLCol)
CROSS APPLY 
    -- you need to include namespace prefix in your XPath expression
    XMLCol.nodes('/wd:Report_Data/wd:Report_Entry') AS XMLCol(ReportEntry);

【讨论】:

  • 感谢您的帮助。我能够解决这个问题。是的,VARCHAR(20) 是不正确的,它实际上是一个 BIT,但它是一个旧的遗留数据集,有人认为 NVARCHAR(100) 对所有事情都有好处......
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2019-12-05
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多