Создание персонализированного XML из SQL-запроса Результаты данных - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь создать результат XML с помощью результата SQL-данных в определенном формате. Но я понятия не имею, как я смогу генерировать. Я знаю основной способ позвонить

В настоящее время согласно Sql Query

DECLARE @cityFrom VARCHAR(10)= 'Berlin';
DECLARE @CustomerFrom VARCHAR(25)= CASE
     WHEN @cityFrom = 'Berlin'
     THEN 'ID_1'
     WHEN @cityFrom = 'London'
     THEN 'ID_2'
     WHEN @cityFrom = 'Tsawassen'
     THEN 'ID_3'
     WHEN @cityFrom = 'Mannheim'
     THEN 'ID_4'
 END;

    SELECT CustomerID,
       CustomerName,
       Country
    FROM Customers
    WHERE City = @cityFrom;
FOR XML PATH (''), ROOT('table') 

Я получаю этот вывод

<table>
  <CustomerID>1</CustomerID>
  <CustomerName>Alfreds Futterkiste</CustomerName>
  <Country>Germany</Country>
</table>

Но я бы хотел получить ожидаемый результат, как показано ниже,

<ID_1>
    <Parameter key="ID_1_CustomerID">1</Parameter>
    <Parameter key="ID_1_CustomerName">Alfreds Futterkiste</Parameter>
    <Parameter key="ID_1_Country">Germany</Parameter>
</ID_1>

Я звоню @CustomerFrom, поскольку я хотел опубликовать его как <ID_1>...</ID_1>. Также я знаю, что <table>...</table> отправлено через ROOT ('таблица'), но я не могу передать ROOT (@CustomerFrom) для ...

Вопрос: Есть ли какое-нибудь решение, как я могу получить ожидаемый результат?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Попробуйте это с помощью Xml Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml = "<table>\n" +
                            "<CustomerID>1</CustomerID>\n" +
                            "<CustomerName>Alfreds Futterkiste</CustomerName>\n" +
                            "<Country>Germany</Country>\n" +
                            "</table>";

            XElement table = XElement.Parse(xml);
            int id = (int)table.Element("CustomerID");

            XElement xID = new XElement("ID_1");

            foreach (XElement element in table.Elements())
            {
                xID.Add(new XElement("Parameter",  new object[]  {new XAttribute("key", "ID_" + id.ToString() + "_" + element.Name.LocalName), (string)element}));
            }


        }
    }
}
0 голосов
/ 08 сентября 2018

Плохо называть элемент переменной (подробнее об этом позже).Но это может быть решено :

DECLARE @mockup TABLE(CustomerID INT, CustomerName VARCHAR(100),Country VARCHAR(100),City VARCHAR(100));
INSERT INTO @mockup VALUES(99,'TestName','Germany','Berlin');

DECLARE @cityFrom VARCHAR(10)= 'Berlin';

DECLARE @CustomerFrom VARCHAR(25)= CASE
     WHEN @cityFrom = 'Berlin'
     THEN 'ID_1'
     WHEN @cityFrom = 'London'
     THEN 'ID_2'
     WHEN @cityFrom = 'Tsawassen'
     THEN 'ID_3'
     WHEN @cityFrom = 'Mannheim'
     THEN 'ID_4'
 END;

SELECT @CustomerFrom + '_CustomerID' AS [Parameter/@key]
       ,CustomerID AS [Parameter]
       ,''
       ,@CustomerFrom + '_CustomerName' AS [Parameter/@key]
       ,CustomerName AS [Parameter]
       ,''
       ,@CustomerFrom + '_Country' AS [Parameter/@key]
       ,Country AS [Parameter]
FROM @mockup
FOR XML PATH('ReplaceThis');

На следующем шаге вам нужно привести это значение к NVARCHAR(MAX) и использовать REPLACE, чтобы получить ID_1 в кореньузел ...

Я не знаю, если ожидаемый результат должен быть таким ...

Очень плохая идея выдвигать информацию ( content ) в имя элемента.Вместо <ID_1> я бы предложил что-то вроде <ID location="1">.

И вместо ID_1_CustomerID я бы использовал два атрибута или взял бы эту информацию с уровня выше.

Попробуйте:

SELECT @CustomerFrom AS [@location]
       ,'CustomerID' AS [Parameter/@key]
       ,CustomerID AS [Parameter]
       ,''
       ,'CustomerName' AS [Parameter/@key]
       ,CustomerName AS [Parameter]
       ,''
       ,'Country' AS [Parameter/@key]
       ,Country AS [Parameter]
FROM @mockup
FOR XML PATH('ID');

результат

<ID location="ID_1">
  <Parameter key="CustomerID">99</Parameter>
  <Parameter key="CustomerName">TestName</Parameter>
  <Parameter key="Country">Germany</Parameter>
</ID>
...