SQL Server: анализ XML в поле с неизвестным пространством имен - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь проанализировать XML из столбца, чтобы добавить его в представление для отчетов, но я не знаю пространства имен.Это может быть сложнее, потому что поля в XML создаются только после того, как поле используется в базовом приложении.Таблица pfm.Entity, из которой я пытаюсь проанализировать XML из столбца Custom #, структурирована со следующими столбцами:

[RootId#] ,[Id#] ,[LastId#] ,[Guid#] ,[Custom#] ,[Type#]

Моя цель состоит в том, чтобы разобрать XML, содержащийся в Custom #, в столбцы так, чтобыЯ могу присоединиться к таблице вместе с другими в поле RootId #.Ниже приведен оператор выбора, с которым я тестирую:

WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema' as ns)  
    SELECT TOP (1000)
        Custom#.value('(/ns:Fields/ns:Field)[1]', 'VARCHAR(50)') AS xmlfield
    FROM 
        [SelectDb].[pfm].[Entity]

Я предполагаю, что мне нужно будет выбрать что-то вроде ниже, но это приводит к ошибке на символе #.

SELECT 
    Custom#.value('(/ns:Fields/ns:MarketingSrcPercentage_901419#)[1]', 'VARCHAR(50)') AS mktsrcp

Ниже приведены два примера того, как может выглядеть XML в поле.Имейте в виду, что есть строки, в которых это значение также равно NULL.

<Fields>
  <Field name="PurchaseDate_NJ#">6/11/2018</Field>
  <Field name="AddOrImpDate_NJ#">8/1/2018</Field>
  <Field name="AffidavitAddOrExcep_NJ#">nfui fevtt[th40thijfkrkl grwgr ijg rgmrk gmkmr pkgi</Field>
  <Field name="DateOfPropertyAcquisition_DC#">8/7/2018</Field>
  <Field name="AuthorizedAppointedAgent_PA#">NAME OF PERSON AUTHORIZED/APPONTED AGENT PROMPT BOX</Field>
  <Field name="SpouseWaivingMaritalRights_PA#">NAME OF SPOUSE WAIVING MARTIAL RIGHTS PROMPT BOX</Field>
  <Field name="PersonalFunds_TXFA#">true</Field>
  <Field name="Currency_TXFA#">true</Field>
  <Field name="CashiersCheck_TXFA#">true</Field>
  <Field name="TravelersCheck_TXFA#">true</Field>
  <Field name="MoneyOrder_TXFA#">true</Field>
  <Field name="BusinessCheck_TXFA#">true</Field>
  <Field name="PersonalCheck_TXFA#">true</Field>
  <Field name="BankruptcyFilings_NY#">true</Field>
</Fields>

и

<Fields>
  <Field name="">1</Field>
  <Field name="MarketingSrcPercentage_901419#">1</Field>
  <Field name="MarketingRep1Name_901419#">Brian</Field>
</Fields>

В случае, если это полезно, это база данных для SoftPro Select.Я просмотрел их документацию, но ничего не нашел.

РЕДАКТИРОВАТЬ: Добавлено в более четкое определение исходной таблицы.

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Я нашел решение проблемы, но не идеальное решение, которое бы вытягивало все поля и сортировало их по столбцам. Я все еще ищу пространство имен, но ниже работает пока.

SELECT TOP (1000)
    entity.Custom#.value('data(//Field[@name="MarketingRep1Name_901419#"])[1]','VARCHAR(100)') 'MarketingRep1'
FROM 
    [SelectDb].[pfm].[Entity] entity
0 голосов
/ 17 марта 2019

XML, который вы предоставляете, не содержит пространства имен?Я не знаю, почему вы думаете, что вам нужно WITH XMLNAMESPACES вообще ...

Попробуйте это:

DECLARE @xml XML=
N'<Fields>
  <Field name="PurchaseDate_NJ#">6/11/2018</Field>
  <Field name="AddOrImpDate_NJ#">8/1/2018</Field>
  <Field name="AffidavitAddOrExcep_NJ#">nfui fevtt[th40thijfkrkl grwgr ijg rgmrk gmkmr pkgi</Field>
  <Field name="DateOfPropertyAcquisition_DC#">8/7/2018</Field>
  <Field name="AuthorizedAppointedAgent_PA#">NAME OF PERSON AUTHORIZED/APPONTED AGENT PROMPT BOX</Field>
  <Field name="SpouseWaivingMaritalRights_PA#">NAME OF SPOUSE WAIVING MARTIAL RIGHTS PROMPT BOX</Field>
  <Field name="PersonalFunds_TXFA#">true</Field>
  <Field name="Currency_TXFA#">true</Field>
  <Field name="CashiersCheck_TXFA#">true</Field>
  <Field name="TravelersCheck_TXFA#">true</Field>
  <Field name="MoneyOrder_TXFA#">true</Field>
  <Field name="BusinessCheck_TXFA#">true</Field>
  <Field name="PersonalCheck_TXFA#">true</Field>
  <Field name="BankruptcyFilings_NY#">true</Field>
</Fields>';

- Просто несколько примеров, чтобы получить ваши именованные значения в типе-обезопасный способ.
- Остальное работает так же ...

SELECT @xml.value('(/Fields/Field[@name="PurchaseDate_NJ#"])[1]','date') AS [PurchaseDate_NJ#]
      ,@xml.value('(/Fields/Field[@name="AuthorizedAppointedAgent_PA#"])[1]','nvarchar(max)') AS [AuthorizedAppointedAgent_PA#]
      ,@xml.value('(/Fields/Field[@name="Currency_TXFA#"])[1]','bit') AS [Currency_TXFA#]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...