【问题标题】:Build XML from a SQL Table with XPath and Attribute Values从带有 XPath 和属性值的 SQL 表构建 XML
【发布时间】:2017-02-03 17:26:49
【问题描述】:

我必须通过查询一个充满 xpath 条目的数据库来构建一个 XML 文件 (ms sql) 描述一些配置值(格式不可更改)

例如3列,varchar

Path                            Attribute   Value
/configuration/options/startup  showSplash  1
/configuration/settings         idletime    1400
/configuration/options/defaults maxWindows  5   

我开始将一个 xml 与 c# 代码放在一起, 合并重叠路径 但后来想到用 sql 来做。

<configuration>
  <options>
    <startup showSplash="1" />
    <defaults maxWindows="1" />
  </options>
  <settings idletime="1400" />
</configuration>

这可能吗 - 我在任何地方都没有找到类似的东西

【问题讨论】:

  • 这个 xml 和数据表示的动态程度如何?这是否必须使用 SQL Server 完成?
  • 每个 xpath 都从配置开始,但随后任何事情都可能发生并且深度可变 - 我的第一个猜测是在 sql server 之外对其进行编程,这完全没有问题。我想知道是否可以使用存储过程(并且不是非常困难)
  • 虽然不是不可能...在 tsql 中执行此操作将非常困难。如果您希望从视图中返回它,最好使用 SQL CLR。如果它是一组固定值,您可以编写替换查询,但基于路径动态构建 XML 文件并不是 SQL 的设计初衷。

标签: sql-server xml xpath


【解决方案1】:

您可以从原始表中创建一个选择列表,该列表可以连接到动态选择语句中,并最终使用 sp_sqlexec 执行。

我试过这样的。

DECLARE @strPaths VARCHAR(MAX)
DECLARE @sqlString NVARCHAR(MAX)

SELECT
    @strPaths
    =
    STUFF(
            (
                SELECT
                        ', ' + Value + ' [' + SUBSTRING([Path], 2, LEN([Path]) - 1) + '/@' + Attribute + ']'
                    FROM yourTable
                    ORDER BY [Path]
                    FOR XML PATH('')
            )
            ,1,2,''
        )

SET @sqlString = 'SELECT (SELECT ' + @strPaths + ' FOR XML PATH(''''), TYPE) [XML]'

EXEC sp_sqlexec @sqlString

返回您正在寻找的确切 XML

<configuration>
  <options>
    <defaults maxWindows="5" />
    <startup showSplash="1" />
  </options>
  <settings idletime="1400" />
</configuration>

但是如果我取出“ORDER BY [Path]”。生成的 XML 完全不同。

<configuration>
  <options>
    <startup showSplash="1" />
  </options>
  <settings idletime="1400" />
  <options>
    <defaults maxWindows="5" />
  </options>
</configuration>

因此,您必须确定路径的顺序才能使用这样的解决方案。

结论:只有当你有一个排序标准时,它才能做到。

【讨论】:

  • 非常感谢,我明天试试这个,然后给你的答案排序
  • 有一个小问题,我不得不在值周围加上额外的单引号。似乎工作得很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 2013-03-16
  • 2021-11-24
  • 2016-08-01
  • 1970-01-01
相关资源
最近更新 更多