在SQL服务器我可以插入多个节点成XML从一个表?
-
02-07-2019 - |
题
我想要生成某些XML在一个存储程序的数据为基础在一个表中。
下面插入允许我加多点但是他们必须是硬编码或使用的变量(sql:变量):
SET @MyXml.modify('
insert
<myNode>
{sql:variable("@MyVariable")}
</myNode>
into (/root[1]) ')
这样我就可以循环中的每一条记录我的桌子,把值的我需要进入变量和执行上述声明。
但是有一样我可以这样做,只是结合一个选择声明,并避免的循环?
编辑 我有用 SELECT FOR XML
要做到类似的东西之前,但我总是觉得很难读工作时,与一个层次结构的数据从多个表格。我希望会有什么用 modify
在XML产生的更明确和更加可控制的。
解决方案
你有没有试过 筑巢 XML路标的价值的功能吗?与嵌套技术,可以刹车你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已经写入没有用于XML路条款,并为@NestedInput_SpecificDogName=99返回的单一行集记录:
@SpecificDogNameId DogName 99 Astro
但与XML路条款,
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>
其他提示
您能详细说明您打算做什么吗? 它只是根据表的内容生成XML数据 或者从表中添加一些数据到现有的xml结构?
关于XML的主题,有一系列精彩文章 SQLServer由Jacob Sebastian编写,它以从数据生成XML的基础知识开始表
使用sql:列而不是sql:variable。您可以在此处找到详细信息: http://msdn.microsoft.com/en -us /库/ ms191214.aspx