【问题标题】:Creating personalized XML from SQL query Data result从 SQL 查询数据结果创建个性化 XML
【发布时间】:2018-09-05 20:33:29
【问题描述】:

我正在尝试通过我的 SQL 数据结果以特定格式创建一个 xml 结果。但我不知道我将如何生成。我知道一种基本的调用方式

目前按照下面的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,因为我想将其发布为&lt;ID_1&gt;...&lt;/ID_1&gt;。我也知道&lt;table&gt;...&lt;/table&gt; 是通过 ROOT('table') 发布的,但我无法通过 ROOT(@CustomerFrom) 获取 ...

问题:有什么解决方案可以让我得到预期的结果吗?

【问题讨论】:

    标签: xml sql-server-2012


    【解决方案1】:

    用变量命名元素是个坏主意(稍后会详细介绍)。但是这个可以解决:

    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 放入根节点...

    我不知道,预期的结果是否需要这样......

    将信息(内容)推送到元素的名称中是一个非常糟糕的主意。而不是&lt;ID_1&gt;,我建议使用&lt;ID location="1"&gt;

    而不是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>
    

    【讨论】:

    • 感谢您的回答,但我在说明中显示的输出是必需的输出格式,我无法更改。
    • 但是是否可以将信息(内容)推送到元素的名称&lt;ID_1&gt;
    【解决方案2】:

    使用 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 给出的答案而你没有得到它我不仅返回值,还返回特定格式的每个值的字段名称,即&lt;Parameter key ="....跨度>
    • 关于插入 XML 我在here 中有一个问题。同样,我不仅将值插入到 XML 文件中,而且还插入了格式的完整节点。
    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多