Проблема с запросом столбца XML с пространствами имен в SQL - PullRequest
0 голосов
/ 26 марта 2019

Мне нужно получить данные из 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 Ответ

1 голос
/ 26 марта 2019

Вам необходимо включить пространство имен в выражение 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 символа Юникод это 62 символа для кода страны (который состоит из 2 символов ASCII). Вы, вероятно, хотите пересмотреть свои типы данных здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...