Выбрать столбцы смешанного типа, включая все значения из столбца XML?

У меня есть таблица со смешанными типами столбцов (int, varchar, & xml). Столбцы varchar содержат данные в формате XML, а столбец xml - большой узел данных. Я пытаюсь выбрать все varchar столбцы с включенным XML, чтобы создать выходной файл XML с помощью шага задания агента SQL. Проблема, с которой я столкнулся, заключается в том, что столбец, определенный как XML, заполняет много пробелов в файле и усекает данные в этом столбце. Таблица выглядит следующим образом:

CREATE TABLE [dbo].[MixedTYPEXML](
    [col1] [varchar](4) NOT NULL,
    [col2] [int] NOT NULL,
    [xmlinText1] [varchar](190) NOT NULL,
    [JOBP] [xml] NULL
) 
GO

INSERT INTO [dbo].[MixedTypeXML]
           ([col1]
           ,[col2]
           ,[xmlinText1]
           ,[JOBP]
           )
     VALUES
           ('Prod'
           ,'35490'
           ,'<JOBP AllowExternal="1" name="JOBP.EXTRACTS_PHP_SSIS_POST_CORE#35490">'
           ,'<PreCon><conditions id="CONDITIONS" /></PreCon>'
)
GO

Моя инструкция выбора

SELECT col2, xmlinText1, JOBP from dbo.MixedTypeXML

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

35490 <JOBP AllowExternal="1" name="JOBP.EXTRACTS_PHP_SSIS_POST_CORE#35490"> <PreCon><conditions id="CONDITIONS" /></PreCon>

Это всего лишь подмножество столбцов, которые я пытаюсь извлечь. Мне в основном нужно извлечь все столбцы в таблице, включая столбец, определенный XML, чтобы отправить результаты в выходную таблицу на локальном диске без заполнения пробелов или усечения данных. Выходной файл будет файлом в формате XML. Данные образца столбца JOBP - это просто фрагмент. Фактические данные содержат несколько сотен строк xml узлов.

Я просмотрел множество сообщений о том, как извлекать узлы и значения, но я не пытаюсь извлекать конкретные данные. Я хочу, чтобы вся таблица создавала выходной XML-файл. Есть идеи, как это сделать?


person VLo88    schedule 21.01.2020    source источник
comment
(1) Подтвердите, что выходной файл должен быть в формате XML. (2) Обновите свой вопрос и добавьте выборку данных с помощью операторов INSERT. (3) Пожалуйста, предоставьте образец желаемого результата на основе данных образца.   -  person Yitzhak Khabinsky    schedule 21.01.2020


Ответы (2)


Исходя из желаемого результата, весь выходной файл должен быть в формате XML. Это не может быть частично * .csv файл, смешанный с элементами XML.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (
    [col1] VARCHAR(4) NOT NULL,
    [col2] INT NOT NULL,
    [xmlinText] VARCHAR(190) NOT NULL,
    [JOBP] XML NULL
);

INSERT INTO @tbl ([col1] ,[col2] ,[xmlinText] ,[JOBP])
VALUES
(
    'Prod'
    ,35490
    ,'<JOBP AllowExternal="1" name="JOBP.EXTRACTS_PHP_SSIS_POST_CORE#35490"/>'
    ,'<PreCon><conditions id="CONDITIONS" /></PreCon>'
)
-- DDL and sample data population, end

SELECT col1, col2
    , TRY_CAST([xmlinText] AS XML) AS [xmlinText]
    , JOBP
FROM @tbl
FOR XML PATH('row'), TYPE, ROOT('root');

Выход

<root>
  <row>
    <col1>Prod</col1>
    <col2>35490</col2>
    <xmlinText>
      <JOBP AllowExternal="1" name="JOBP.EXTRACTS_PHP_SSIS_POST_CORE#35490" />
    </xmlinText>
    <JOBP>
      <PreCon>
        <conditions id="CONDITIONS" />
      </PreCon>
    </JOBP>
  </row>
</root>
person Yitzhak Khabinsky    schedule 21.01.2020
comment
@Yuzhak Это сработает, но я не хочу вводить новые теги. Я не буду извлекать столбцы, содержащие данные в формате, отличном от XML, а буду извлекать только varchar столбцы, содержащие XML вместе с столбцом, определенным XML. Все XML столбцы данных имеют необходимые открывающие и закрывающие вкладки. - person VLo88; 22.01.2020
comment
В таком случае просто удалите столбцы col1 и col2 из оператора SELECT. - person Yitzhak Khabinsky; 22.01.2020
comment
@Yuzhak Но остаются теги <root>, <row>. Могу ли я оставить значения Path и ROOT в скобках пустыми? - person VLo88; 22.01.2020
comment
Они нужны вам для сохранения правильного формата сгенерированного XML. Проверьте это: en.wikipedia.org/wiki/Well-formed_document - person Yitzhak Khabinsky; 22.01.2020
comment
@Yuzhak Мой XML будет хорошо сформирован без них. Это просто добавит дополнительные теги, которые мне потом нужно будет решить, как удалить. У меня есть несколько запросов, которые будут добавлять XML в файл в правильном порядке, и я не хочу удалять все теги <root> и <row>. Меня больше всего беспокоило наличие пробелов для заполнения столбцов типа xml до и после фактических данных при выполнении запроса select с столбцами, отличными от xml, которые содержат данные xml. - person VLo88; 22.01.2020

Ни один из приведенных выше ответов не помог мне. В конце концов я получил возможность использовать функцию ПРЕОБРАЗОВАНИЯ строки.

SELECT col1, col2 , CONVERT(VARCHAR(MAX), JOBP) FROM @tbl

person VLo88    schedule 20.02.2020