문제

테이블의 데이터를 기반으로 저장된 절차에서 XML을 생성하고 싶습니다.

다음 삽입물을 사용하면 많은 노드를 추가 할 수 있지만 하드 코딩 또는 사용 변수 (SQL : 변수)가 필요합니다.

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

따라서 테이블의 각 레코드를 루프하고 필요한 값을 변수에 넣고 위의 문을 실행할 수 있습니다.

그러나 일부 명령문과 결합하고 루프를 피 함으로써이 작업을 수행 할 수있는 방법이 있습니까?

편집하다 나는 사용했다 SELECT FOR XML 이전에 비슷한 작업을 수행하려면 여러 테이블의 데이터 계층 구조로 작업 할 때 항상 읽기가 어렵다는 것을 알게됩니다. 나는 무엇을 사용하는 것이 있기를 바랐다 modify 생성 된 XML이 더 명시적이고 통제 가능합니다.

도움이 되었습니까?

해결책

당신은 시도 했습니까? 둥지 XML 경로의 경우 Scalar valued 함수? 중첩 기술을 사용하면 SQL을 매우 관리하기 쉬운/읽기 쉬운 원소 조각으로 브레이크 할 수 있습니다.

면책 조항 : 다음은 작업 예제에서 조정되었지만 그 자체가 문자 그대로 테스트되지 않았습니다.

일반 청중을위한 일부 참조 링크

가장 단순하고 가장 낮은 레벨 중첩 노드 예제

다음 호출을 고려하십시오

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

xml 경로 조항없이 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을 생성합니다 ( @ 부호는 특정 dognameid 필드를 속성으로 반환합니다).

<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 : variable 대신 SQL : 열을 사용하십시오. 자세한 정보는 다음을 참조하십시오. http://msdn.microsoft.com/en-us/library/ms191214.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top