在SQL Server中,我可以从表中将多个节点插入XML吗?
我想基于表中的数据在存储过程中生成一些XML。
以下插入内容使我可以添加许多节点,但是它们必须经过硬编码或者使用变量(sql:variable):
SET @MyXml.modify(' insert <myNode> {sql:variable("@MyVariable")} </myNode> into (/root[1]) ')
因此,我可以遍历表中的每条记录,将所需的值放入变量中并执行上面的语句。
但是,有没有一种方法可以通过与select语句组合并避免循环来做到这一点?
编辑我以前使用过" SELECT FOR XML"来做类似的事情,但是在处理来自多个表的数据层次结构时,我总是很难看懂。我希望使用modify
可以使生成的XML更明确,更可控。
解决方案
我们能否进一步说明我们打算做什么。
是否只是根据表的内容生成XML数据?
或者将表中的某些数据添加到现有的xml结构中?
由雅各布·塞巴斯蒂安(Jacob Sebastian)撰写的有关SQLServer中XML主题的系列文章很多,它从从表中的数据生成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)
假设udfGetLowestLevelNestedNode_SpecificDogName是在没有FOR XML PATH子句的情况下编写的,并且对于@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字段作为属性返回)
<Dog SpecificDogNameId=99>Astro</Dog>
嵌套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节点(给定适当的基础数据)
<DogCollection> <Dog SpecificDogNameId="88">Dino</Dog> <Dog SpecificDogNameId="99">Astro</Dog> </DogCollection>
从这里开始,我们可以继续在嵌套树中继续工作,以根据需要构建复杂的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节点(如果有适当的基础数据)
<AnimalCollection> <DogCollection> <Dog SpecificDogNameId="88">Dino</Dog> <Dog SpecificDogNameId="99">Astro</Dog> </DogCollection> <CatCollection> <Cat SpecificCatNameId="11">Sylvester</Cat> <Cat SpecificCatNameId="22">Tom</Cat> <Cat SpecificCatNameId="33">Felix</Cat> </CatCollection> </AnimalCollection>
使用sql:column而不是sql:variable。我们可以在这里找到详细的信息:http://msdn.microsoft.com/en-us/library/ms191214.aspx