SQL Запрос на установку нескольких XML элементов с настраиваемыми именами атрибутов - PullRequest
0 голосов
/ 06 августа 2020

Мое требование - вернуть один результат xml путем преобразования запроса SQL, который возвращает несколько элементов в результате.

Итак, запрос SQL выглядит следующим образом:

SELECT 'z_milestonetype' AS 'ColumnValue/@name',  
(select
task_milestone as milestone from PLAN where
request_id='1173' and task_milestone='PC') AS ColumnValue,  null,
'z_actual_finish' AS 'ColumnValue/@name',  
(select effect_dttm as
effect_dttm from PLAN where request_id='1173' and
task_milestone='PC') AS ColumnValue,  null FOR XML PATH ('')

Это на самом деле возвращает XML, как показано ниже

<ColumnValue name="z_milestonetype">LM_EQ</ColumnValue>
<ColumnValue name="z_actual_finish">2020-07-15T18:30:00</ColumnValue>

Поскольку результат возвращает только один результат, это, похоже, работает нормально, но мое требование - установить XML с повторяющимися значениями. См. Ниже код XML.

    <customObjectInstances objectCode="zsinboundtask">
          <instance instanceCode="-1" objectCode="zinboundtask">
            <CustomInformation>
              <ColumnValue name="partition_code">NIKU.ROOT</ColumnValue>
              <ColumnValue name="page_layout">odf.znecinboundtaskFrame</ColumnValue>
              <ColumnValue name="name">-1</ColumnValue>
              <ColumnValue name="code">-1</ColumnValue>               
              <ColumnValue name="z_milestonetype">TEST2</ColumnValue>
              <ColumnValue name="z_finish">2020-09-25T18:30:00</ColumnValue>
            </CustomInformation>
          </instance>
          <instance instanceCode="-1" objectCode="zinboundtask">
            <CustomInformation>
              <ColumnValue name="partition_code">NIKU.ROOT</ColumnValue>
              <ColumnValue name="page_layout">odf.znecinboundtaskFrame</ColumnValue>
              <ColumnValue name="name">-1</ColumnValue>
              <ColumnValue name="code">-1</ColumnValue>                
              <ColumnValue name="z_milestonetype">TEST</ColumnValue>
              <ColumnValue name="z_finish">2020-09-25T18:30:00</ColumnValue>
            </CustomInformation>
          </instance>       
 ………    
        </customObjectInstances>

Если я использую тот же запрос, что и выше, для установки значений для нескольких строк, это покажет ошибку Подзапрос вернул более 1 значения. Это не разрешено, если подзапрос следует за =,! =, <, <=,>,> = Или когда подзапрос используется как выражение.

Это то, что я пробовал до сих пор.

SELECT
'-1' AS 'instance/@instanceCode', 'zinboundtask' AS 'instance/@objectCode',
null,
 null,
 'partition_code' AS 'ColumnValue/@name', 
'NIKU.ROOT' AS ColumnValue,
 null,
 'page_layout' AS 'ColumnValue/@name', 
'odf.zinboundtaskFrame' AS ColumnValue,
 null,
 'name' AS 'ColumnValue/@name', 
'-1' AS ColumnValue,
 null,
 'code' AS 'ColumnValue/@name', 
'-1' AS ColumnValue,
 null,
'z_milestonetype' AS 'ColumnValue/@name', 
(select task_milestone as milestone from PLAN where request_id='1173') AS ColumnValue,
 null,
'z_finish' AS 'ColumnValue/@name', 
(select effect_dttm as effect_dttm from PLAN where request_id='1173') AS ColumnValue,
 null
FOR XML PATH ('CustomInformation')

Как объяснялось,

  1. Мне нужно, чтобы XML был отформатирован с помощью настраиваемых атрибутов
  2. Тем временем мне нужно отображать элементы из запроса выбора в учитывая xml формат

Мы будем очень благодарны за любые предложения.

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Пока вы ждете DDL и выборки данных, вот вам концептуальный пример.

Вам просто нужно добавить все свои столбцы, добавить WHERE clause logi c, et c .

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, partition_code VARCHAR(30), page_layout VARCHAR(50), z_finish DATETIME);
INSERT INTO @tbl (partition_code, page_layout, z_finish) VALUES
(   'NIKU.ROOT', 'odf.znecinboundtaskFrame', '2020-09-25T18:30:00'),
(   'NIKU.BOOT', 'odf.inboundtaskFrame', '2018-01-25T22:20:00');
-- DDL and sample data population, end

SELECT (
    SELECT 'partition_code' as 'ColumnValue/@name', partition_code as [ColumnValue]
        , ''
        , 'page_layout' as 'ColumnValue/@name', page_layout as [ColumnValue]
        , ''
        , 'z_finish' as 'ColumnValue/@name', z_finish as [ColumnValue]
    FROM @tbl
    FOR XML PATH('CustomInformation'), TYPE
).query('<customObjectInstances objectCode="zsinboundtask">
{
    for $x in CustomInformation
    return <instance instanceCode="-1" objectCode="zinboundtask">
        {$x}
    </instance>
}
</customObjectInstances>')

Выход

<customObjectInstances objectCode="zsinboundtask">
  <instance instanceCode="-1" objectCode="zinboundtask">
    <CustomInformation>
      <ColumnValue name="partition_code">NIKU.ROOT</ColumnValue>
      <ColumnValue name="page_layout">odf.znecinboundtaskFrame</ColumnValue>
      <ColumnValue name="z_finish">2020-09-25T18:30:00</ColumnValue>
    </CustomInformation>
  </instance>
  <instance instanceCode="-1" objectCode="zinboundtask">
    <CustomInformation>
      <ColumnValue name="partition_code">NIKU.BOOT</ColumnValue>
      <ColumnValue name="page_layout">odf.inboundtaskFrame</ColumnValue>
      <ColumnValue name="z_finish">2018-01-25T22:20:00</ColumnValue>
    </CustomInformation>
  </instance>
</customObjectInstances>
0 голосов
/ 06 августа 2020

Вы можете использовать тег [text ()], например:

select name as '@name' , o.object_id as [text()]
from sys.objects o
for xml path('ColumnValue')

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

...