我想基于表中的数据在存储过程中生成一些XML.
以下插入允许我添加许多节点,但它们必须是硬编码或使用变量(sql:variable):
SET @MyXml.modify(' insert{sql:variable("@MyVariable")} into (/root[1]) ')
所以我可以循环遍历表中的每个记录,将我需要的值放入变量并执行上面的语句.
但是,有一种方法可以通过与select语句结合并避免循环来实现这一点吗?
编辑我之前曾经SELECT FOR XML
做过类似的事情,但是在处理来自多个表的数据层次结构时,我总是觉得很难阅读.我希望有一些东西可以使用modify
XML生成的地方更明确,更可控.
您是否尝试过嵌套 FOR XML PATH标量值函数?使用嵌套技术,您可以将SQL制作成非常易于管理/可读的元素
免责声明:以下内容虽然改编自一个工作示例,但本身并未进行过字面测试
一般受众的一些参考链接
http://msdn2.microsoft.com/en-us/library/ms178107(SQL.90).aspx
http://msdn2.microsoft.com/en-us/library/ms189885(SQL.90).aspx
最简单,最低级别的嵌套节点示例
考虑以下调用
DECLARE @NestedInput_SpecificDogNameId int SET @NestedInput_SpecificDogNameId = 99 SELECT [dbo].[udfGetLowestLevelNestedNode_SpecificDogName] (@NestedInput_SpecificDogNameId)
假设在没有FOR XML PATH子句的情况下编写了udfGetLowestLevelNestedNode_SpecificDogName,并且对于@NestedInput_SpecificDogName = 99,它返回单行集记录:
@SpecificDogNameId DogName 99 Astro
但是使用FOR XML PATH子句,
CREATE FUNCTION dbo.udfGetLowestLevelNestedNode_SpecificDogName ( @NestedInput_SpecificDogNameId ) RETURNS XML AS BEGIN -- Declare the return variable here DECLARE @ResultVar XML -- Add the T-SQL statements to compute the return value here SET @ResultVar = ( SELECT @SpecificDogNameId as "@SpecificDogNameId", t.DogName FROM tblDogs t FOR XML PATH('Dog') ) -- Return the result of the function RETURN @ResultVar END
用户定义的函数生成以下XML(@符号使得SpecificDogNameId字段作为属性返回)
Astro
嵌套XML类型的用户定义函数
用户定义的函数(如上面的udfGetLowestLevelNestedNode_SpecificDogName)可以嵌套,以提供生成复杂XML的强大方法.
例如,功能
CREATE FUNCTION [dbo].[udfGetDogCollectionNode]() RETURNS XML AS BEGIN -- Declare the return variable here DECLARE @ResultVar XML -- Add the T-SQL statements to compute the return value here SET @ResultVar = ( SELECT [dbo].[udfGetLowestLevelNestedNode_SpecificDogName] (t.SpecificDogNameId) FROM tblDogs t FOR XML PATH('DogCollection') ELEMENTS ) -- Return the result of the function RETURN @ResultVar END
当被调用为
SELECT [dbo].[udfGetDogCollectionNode]()
可能会产生复杂的XML节点(给定适当的底层数据)
Dino Astro
从这里开始,您可以继续在嵌套树中向上工作,以便根据需要构建复杂的XML结构
CREATE FUNCTION [dbo].[udfGetAnimalCollectionNode]() RETURNS XML AS BEGIN DECLARE @ResultVar XML SET @ResultVar = ( SELECT dbo.udfGetDogCollectionNode(), dbo.udfGetCatCollectionNode() FOR XML PATH('AnimalCollection'), ELEMENTS XSINIL ) RETURN @ResultVar END
当被调用为
SELECT [dbo].[udfGetAnimalCollectionNode]()
udf可能会产生更复杂的XML节点(给定适当的底层数据)
Dino Astro Sylvester Tom Felix