你有没有尝试过nestingFOR 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>