開始你試過築巢 FOR XML PATH標量值的功能呢? 隨着嵌套技術,你可以剎車的SQL成非常易於管理/可讀元素片
免責聲明:以下,而從工作示例改編,本身並未被逐字測試
一些參考鏈接爲一般觀衆
最簡單的,最低級的嵌套節點例如
考慮以下調用
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>