Я пытаюсь создать результат xml через результат данных SQL в определенном формате. Но я понятия не имею, как я смогу генерировать. Я знаю простой способ вызвать
В настоящее время согласно нижеприведенному запросу Sql
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 ('table'), но я не могу передать ROOT (@CustomerFrom) для ...
Вопрос: Есть ли какое-нибудь решение, как получить ожидаемый результат?
Называть элемент переменной - плохая идея (подробнее об этом позже). Но это может решаемо:
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
в корневой узел ...
Я не знаю, нужно ли ожидаемый результат таким образом ...
Вставлять информацию (содержание) в имя элемента - очень плохая идея. Вместо <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>
Но можно ли протолкнуть информацию (контент) в имя элемента <ID_1>
Попробуйте это с помощью 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}));
}
}
}
}
Я уже получил свой ответ, который дал @Shnugo. И вы его не получаете. Я возвращаю не только значения, но и имя поля каждого значения в определенном формате, который является <Parameter key = "....
.
А по поводу вставки в XML у меня есть сообщение с этим вопросом в том здесь. То же самое для этого, я не только вставляю значения в файл XML, но также и полный узел в формате.
Спасибо за ваш ответ, но результат, который я показал в своем описании, является обязательным форматом вывода, я не могу его изменить.