Это действительно XML и как реплицировать с SQL сервером - PullRequest
0 голосов
/ 23 марта 2020

Мне нужно реплицировать файл XML с сервером SQL, и теперь я спотыкаюсь о следующей структуре внутри файла XML, и я не знаю, как это скопировать.

На данный момент структура выглядит следующим образом для определенных тегов:

        <ART_TAG1>
            <UNMLIMITED/>
        </ART_TAG1>
        <ART_TAG2>
            <ART_TAG3>
                <Data_Entry/>
            </ART_TAG3>
        </ART_TAG2>

Мне интересно, правильно ли это XML, что данные внутри (unlimited и Data_Entry) заключены в закрывающий тег XML. Валидатор XML https://www.w3schools.com/xml/xml_validator.asp говорит мне, что это правильно. Но сейчас я пытаюсь воспроизвести это с помощью Transact- SQL.

. Если я попытаюсь воспроизвести это, я могу только придумать следующий скрипт T SQL, который, очевидно, не полностью выглядит как оригинал .

  SELECT 'UNLIMITED' as 'ART_TAG1'
    , 'Data_Entry' as 'ART_TAG2/ART_TAG3'
    FOR XML PATH(''), ROOT('root')

  <root>
  <ART_TAG1>UNLIMITED</ART_TAG1>
  <ART_TAG2>
  <ART_TAG3>Data_Entry</ART_TAG3>
  </ART_TAG2>
  </root>

1 Ответ

1 голос
/ 23 марта 2020

Если я правильно понял, ваш вопрос:

Как мне поставить запрос для создания этих <SomeElement /> тегов?

Посмотрите на это:

- это создаст заполненные узлы

SELECT 'outer' AS [OuterNode/@attr]
      ,'inner' AS [OuterNode/InnerNode]
FOR XML PATH('row');

- пустая строка представляет собой некоторый контент

SELECT 'outer' AS [OuterNode/@attr]
      ,'' AS [OuterNode/InnerNode]
FOR XML PATH('row');

- отсутствующее значение (NULL) по умолчанию опущено

SELECT 'outer' AS [OuterNode/@attr]
      ,NULL AS [OuterNode/InnerNode]
FOR XML PATH('row');

- Теперь проверьте, что здесь происходит:
--First XML имеет пустой элемент, а второй использует самозакрывающийся элемент

DECLARE @xml1 XML=
N'<row>
  <OuterNode attr="outer">
    <InnerNode></InnerNode>
  </OuterNode>
</row>';

DECLARE @xml2 XML=
N'<row>
  <OuterNode attr="outer">
    <InnerNode/>
  </OuterNode>
</row>';

SELECT @xml1,@xml2;

Результат одинаков для обоих ...

Некоторый фон: Семантически пустой элемент <element></element> точно такой же, как самозакрывающийся элемент <element />. Это не должно иметь никакого значения, используете ли вы один или другой. Если ваш потребитель не может справиться с этим, это проблема в части чтения.

Да, вы можете принудительно установить любой контент в XML на строковом уровне, но - как показано в примере выше - это всего лишь (опасный) взлом.

XML в T- SQL возвращает - по умолчанию - отсутствующий узел как NULL, а пустой элемент как пусто (в зависимости от типа данных, и остерегайтесь разницы между элементом и его text() узлом).

Короче говоря: вам не о чем думать ...

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