在SQL中使用名称空间查询XML列的问题

时间:2019-03-26 16:36:26

标签: sql-server

我需要从XML获取数据:

DECLARE @input XML= 
'<Data xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Data xmlns="http://test.com/xmlschema/Data_Schema.xsd">
    <Person defID="414123">
      <GlobalID Type="People" Code="112233" />
      <FirstName>John</FirstName>
      <LastName>Smith</LastName>
      <Email>john.smith@testcompany.com</Email>
      <Department>Sales</Department>
      <CountryCode>US</CountryCode>
      <CompanyName>Test Company</CompanyName>
    </Person>
  </Data>
</Data>';

我对XML结构无能为力,这是我已经尝试的方法:

WITH XMLNAMESPACES('http://test.com/xmlschema/Data_Schema.xsd' AS x1)
   SELECT [Email] = PersonLevel.value('(Email)[1]', 'nvarchar(64)'), 
        [FirstName] = PersonLevel.value('(FirstName)[1]', 'nvarchar(64)'), 
        [LastName] = PersonLevel.value('(LastName)[1]', 'nvarchar(64)'), 
        [Department] = PersonLevel.value('(Department)[1]', 'nvarchar(64)'), 
        [CountryCode] = PersonLevel.value('(CountryCode)[1]', 'nvarchar(64)'), 
        [CompanyName] = PersonLevel.value('(CompanyName)[1]', 'nvarchar(64)')
 FROM @Input.nodes('/Data/x1:Data/x1:Person') AS XT1(PersonLevel);

我的查询结果为NULL值,我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您需要在value表达式中包含名称空间:

WITH XMLNAMESPACES ('http://test.com/xmlschema/Data_Schema.xsd' AS x1)
SELECT PersonLevel.value('(x1:Email)[1]', 'nvarchar(64)') AS [Email],
       PersonLevel.value('(x1:FirstName)[1]', 'nvarchar(64)') AS [FirstName],
       PersonLevel.value('(x1:LastName)[1]', 'nvarchar(64)') AS [LastName],
       PersonLevel.value('(x1:Department)[1]', 'nvarchar(64)') AS [Department],
       PersonLevel.value('(x1:CountryCode)[1]', 'nvarchar(64)') AS [CountryCode],
       PersonLevel.value('(x1:CompanyName)[1]', 'nvarchar(64)') AS [CompanyName]
FROM @input.nodes('/Data/x1:Data/x1:Person') AS XT1(PersonLevel);

换句话说,您真的需要一切都成为nvarchar(64)吗?我建议64个字符可能不足以用于一个电子邮件地址(当企业拥有长域名,带有子域和全名地址时,我有时会看到一些非常愚蠢的字符),但是64个Unicode字符是国家/地区代码的62个字符(由2个ASCII字符组成)。您可能要在这里重新考虑数据类型。