2008-09-29 41 views
2

我想基於表中的數據在存儲過程中生成一些XML。在SQL Server中,我可以從表中插入多個節點到XML中?

下插入讓我增添了許多節點,但他們必須是硬編碼或使用變量(SQL:變量):

SET @MyXml.modify(' 
     insert 
     <myNode> 
      {sql:variable("@MyVariable")} 
     </myNode> 
     into (/root[1]) ') 

所以,我可以通過我的表中的每個記錄循環,把我需要的變量值並執行上述語句。

但有沒有一種方法,我可以做到這一點,只需結合一個選擇語句,避免循環?

編輯我已經使用SELECT FOR XML來做類似的東西,但是在處理多個表中的數據層次結構時,我總是覺得很難閱讀。我希望能有一些使用modify的東西,其中生成的XML更明確,更可控。

回答

7

開始你試過築巢 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> 
相關問題