2008-09-29 5 views
2

테이블의 데이터를 기반으로 저장 프로 시저에 XML을 생성하려고합니다.SQL Server에서 테이블의 XML에 여러 노드를 삽입 할 수 있습니까?

다음 삽입은 내가 많은 노드를 추가 할 수 있지만 하드 코딩 된 수 또는 변수 (SQL : 변수) : 사용할 필요가 그래서 난 내 테이블의 각 레코드를 통해 루프의를 둘 수 있었다

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

을 값을 변수에 넣고 위의 명령문을 실행합니다.

그러나 선택 문과 결합하여 루프를 피할 수있는 방법이 있습니까?

편집SELECT FOR XML 나는 비슷한 물건을하기 전에 사용했지만 항상 여러 테이블의 데이터 계층 구조로 작업 할 때 읽기가 어렵습니다. 나는 생성 된 XML이보다 명확하고보다 제어 가능한 곳인 modify을 사용하여 무언가가있을 것으로 기대했다.

답변

7

시작?그 자체가 말 그대로 일반에 대한

일부 참조 링크를 테스트 한 다음, 작업 예에서 적응하는 동안,있다 : 중첩 기법으로 , 당신은 읽을 수/매우 관리 가능한 원소 조각

면책 조항에 브레이크 당신의 SQL을 할 수 관객

01 23,414,가장 간단한, 가장 낮은 수준의 중첩 된 노드 예를

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

이의 있던 udfGetLowestLevelNestedNode_SpecificDogName는 XML에 대한 PATH 절없이 작성했던 가정 해 봅시다 다음 호출을 고려하고 @NestedInput_SpecificDogName = 99는 단일 행 집합 기록을 반환 :

 
@SpecificDogNameId DogName 
99     Astro 

그러나 XML에 대한 PATH 절을

,

,632,321 0 사용자 정의 함수는 다음과 같은 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 

(해당 기본 데이터 제공) 복잡한 XML 노드 여기에서

<DogCollection> 
    <Dog SpecificDogNameId="88">Dino</Dog> 
    <Dog SpecificDogNameId="99">Astro</Dog> 
</DogCollection> 

을 생산할 수

SELECT [dbo].[udfGetDogCollectionNode]() 

로 호출 할 때 중첩 된 트리에서 위쪽으로 계속 작업하여 복잡한 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> 
1

정확히 무엇을 할 것인지 계획 할 수 있습니까? 단순히 테이블 의 내용을 기반으로 XML 데이터를 생성하거나 테이블의 데이터를 기존 XML 구조에 추가하는 것입니까?

야곱 세바스찬에 의해 작성의 SQLServer에서 XML에 대한 주제에 great series of articles이있다, 그것은 당신이 XML의 PATH 스칼라 값 함수위한 중첩 을 시도 했 basics of generating XML from the data in the table

관련 문제