簡體   English   中英

在SQL Server中,我可以從表中將多個節點插入XML嗎?

[英]In SQL Server can I insert multiple nodes into XML from a table?

我想基於表中的數據在存儲過程中生成一些XML。

以下插入允許我添加許多節點,但它們必須是硬編碼或使用變量(sql:variable):

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

所以我可以循環遍歷表中的每個記錄,將我需要的值放入變量並執行上面的語句。

但是,有一種方法可以通過與select語句結合並避免循環來實現這一點嗎?

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

您是否嘗試過嵌套 FOR XML PATH標量值函數? 使用嵌套技術,您可以將SQL制作成非常易於管理/可讀的元素

免責聲明:以下內容雖然改編自一個工作示例,但本身並未進行過字面測試

一般受眾的一些參考鏈接

最簡單,最低級別的嵌套節點示例

考慮以下調用

DECLARE  @NestedInput_SpecificDogNameId int
SET @NestedInput_SpecificDogNameId = 99
SELECT [dbo].[udfGetLowestLevelNestedNode_SpecificDogName] 
(@NestedInput_SpecificDogNameId)

假設在沒有FOR XML PATH子句的情況下編寫了udfGetLowestLevelNestedNode_SpecificDogName,並且對於@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>

你能詳細說明你打算做什么嗎? 它只是根據表的內容生成XML數據,還是將表中的一些數據添加到現有的xml結構中?

在Jacob Sebastian編寫的SQLServer中有關於XML主題的大量系列文章 ,它首先從表格中的數據生成XML基礎知識開始

使用sql:列而不是sql:variable。 您可以在此處找到詳細信息: http//msdn.microsoft.com/en-us/library/ms191214.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM