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 犬の名前
99 アストロ
しかし、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>