【发布时间】:2018-08-16 21:09:11
【问题描述】:
在我的应用程序中,我使用FOR XML PATH() 运行一个相当复杂的查询来构造一个xml 结果。我在几个存储过程中使用此查询,但每个根节点和第一级节点名称都不同。我想做的是创建一个标量用户定义函数,它将两个节点名称作为参数并返回正确的 xml。预期的输出如下所示:
<{root node name}>
<{first level node name} attr1="value1" attr2="value2">
<detail attr1="value3">
<error code="1" descr="some error"/>
<error code="3" descr="some other error"/>
</detail>
</{first level node name}>
<error code="4" descr="yet another error"/>
</{root node name}>
将 {root node name} 和 {first level node name} 作为参数传递
我知道我可以使用动态 SQL 来执行此操作,但它可能非常麻烦,我想避免它。我也可以使用 C# 或使用 XSLT 轻松完成此操作,但我需要完全在 SQL 中完成此操作,因为它将从 SQL 服务代理处理程序中调用。
不幸的是,FOR XML PATH 需要一个文字作为节点名称。我还尝试使用已知的通用节点名称创建 xml,然后尝试使用 XQuery 替换它们,但这也需要文字。 XQuery 必须是文字,节点构造函数中使用的节点名称也必须是文字(不能使用sql:variable())
有没有办法用动态节点名创建 XML?
【问题讨论】:
-
“我知道我可以使用动态 SQL 来执行此操作”不在用户定义的函数中....恐怕我知道在数据库级别执行此操作的唯一两个选项是 CLR 或动态 SQL(在存储过程中,而不是 UDF)。
-
没错,但在 UDF 中这样做只是为了方便而不是要求。我可以把它变成一个返回单列结果集的存储过程,或者使用输出参数。
-
这个问题解决了吗?您需要进一步的帮助吗?
-
并非如此。我最终将 UDF 编码为使用通用元素名称,然后在已知元素名称的 UDF 之外使用 xquery 操作 xml,因此 xquery 可以是文字。我必须在我使用该函数的任何地方重复 xquery,这很烦人且容易出错。据我所知,它要么是这个(如果可能的话)要么是动态 SQL。
标签: sql-server xml tsql generics for-xml