使用XPath和属性值从SQL表构建XML

时间:2017-02-03 17:26:49

标签: sql-server xml xpath

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

e.g。 3列,varchar

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

我开始将一个xml与c#代码放在一起, mergin重叠pathes 但后来考虑用sql做这个。

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

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

1 个答案:

答案 0 :(得分:0)

您可以从原始表创建一个选择列表,该列表可以连接到动态选择语句中,最后用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>

所以你必须确定路径的顺序才能使用这样的解决方案。

总之:只有你有订购标准才能做到。