다음을 통해 공유


클라이언트 쪽 및 서버 쪽 XML 서식 지정(SQLXML 4.0)

적용 대상: SQL ServerAzure SQL Database Azure SQL Managed Instance

이 항목에서는 SQLXML에서 클라이언트 쪽 및 서버 쪽 XML 서식의 일반적인 차이점에 대해 설명합니다.

클라이언트 쪽 서식에서 지원되지 않는 여러 행 집합 쿼리

클라이언트 쪽 XML 서식을 사용하는 경우 여러 행 집합을 생성하는 쿼리는 지원되지 않습니다. 예를 들어 가상 디렉터리에 클라이언트 쪽 서식을 지정했다고 가정합니다. sql:query> 블록에 두 개의 SELECT 문이 있는 이 샘플 템플릿을 <고려합니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query>  
     SELECT FirstName FROM Person.Contact FOR XML Nested;   
     SELECT LastName FROM Person.Contact FOR XML Nested    
  </sql:query>  
</ROOT>  

애플리케이션 코드에서 이 템플릿을 실행할 수 있지만 클라이언트 쪽 XML 서식에서 여러 행 집합의 서식 설정을 지원하지 않기 때문에 오류가 반환됩니다. 두 개의 별도 <sql:query 블록에서 쿼리> 를 지정하면 원하는 결과를 얻을 수 있습니다.

클라이언트 및 서버 쪽 서식에서 타임스탬프 맵이 다르게 표시

서버 쪽 XML 서식에서 타임스탬프 형식의 데이터베이스 열은 i8 XDR 형식(XMLDATA 옵션이 쿼리에 지정된 경우)에 매핑됩니다.

클라이언트 쪽 XML 서식에서 타임스탬프 형식의 데이터베이스 열은 uri 또는 bin.base64 XDR 형식에 매핑됩니다(쿼리에서 이진 base64 옵션이 지정되었는지 여부에 따라 다름). 이 형식은 SQL Server 타임스탬프 형식으로 변환되므로 updategram 및 bulkload 기능을 사용하는 경우 bin.base64 XDR 형식이 유용합니다. 이러한 변환 작업을 통해 삽입, 업데이트 또는 삭제 작업이 성공합니다.

서버 쪽 서식에는 중첩이 많은 VARIANT가 사용됨

서버 쪽 XML 서식에서 VARIANT 형식의 전체 형식이 사용됩니다. 클라이언트 쪽 XML 서식을 사용하는 경우 변형은 유니코드 문자열로 변환되고 VARIANT의 하위 형식은 사용되지 않습니다.

중첩 모드 및 AUTO 모드

클라이언트 쪽 FOR XML의 NESTED 모드는 다음과 같은 예외를 제외하고 서버 쪽 FOR XML의 AUTO 모드와 유사합니다.

서버 쪽에서 AUTO 모드를 사용하여 뷰를 쿼리하면 뷰 이름이 결과 XML의 요소 이름으로 반환됩니다.

예를 들어 AdventureWorksdatabase의 Person.Contact 테이블에 다음 보기가 생성된다고 가정합니다.

CREATE VIEW ContactView AS (SELECT ContactID as CID,  
                               FirstName  as FName,  
                               LastName  as LName  
                        FROM Person.Contact)  

다음 템플릿은 ContactView 뷰에 대한 쿼리를 지정하고 서버 쪽 XML 서식도 지정합니다.

 <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="0">  
    SELECT *  
    FROM   ContactView  
    FOR XML AUTO  
  </sql:query>  
</ROOT>  

템플릿을 실행하면 다음 XML이 반환됩니다. (부분 결과만 표시됩니다.) 요소 이름은 쿼리가 실행되는 뷰의 이름입니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <ContactView CID="1" FName="Gustavo" LName="Achong" />   
  <ContactView CID="2" FName="Catherine" LName="Abel" />   
...  
</ROOT>  

해당 NESTED 모드를 사용하여 클라이언트 쪽 XML 서식을 지정하면 기본 테이블 이름이 결과 XML의 요소 이름으로 반환됩니다. 예를 들어 다음 수정된 템플릿은 동일한 SELECT 문을 실행하지만 XML 서식은 클라이언트 쪽에서 수행됩니다(즉, 클라이언트 쪽 xml 은 템플릿에서 true로 설정됨).

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="1">  
    SELECT *  
    FROM   ContactView  
    FOR XML NESTED  
  </sql:query>  
</ROOT>  

이 템플릿을 실행하면 다음 XML이 생성됩니다. 이 경우 요소 이름은 기본 테이블 이름입니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Person.Contact CID="1" FName="Gustavo" LName="Achong" />   
  <Person.Contact CID="2" FName="Catherine" LName="Abel" />   
...  
</ROOT>  

서버 쪽 FOR XML의 AUTO 모드를 사용하는 경우 쿼리에 지정된 테이블 별칭이 결과 XML에 요소 이름으로 반환됩니다.

예를 들어 다음 템플릿을 고려합니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="0">  
    SELECT FirstName as fname,  
           LastName as lname  
    FROM   Person.Contact C  
    FOR XML AUTO  
  </sql:query>  
</ROOT>  

템플릿을 실행하면 다음 XML이 생성됩니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <C fname="Gustavo" lname="Achong" />   
  <C fname="Catherine" lname="Abel" />   
...  
</ROOT>   

클라이언트 쪽 FOR XML의 NESTED 모드를 사용하면 테이블 이름이 결과 XML의 요소 이름으로 반환됩니다. (쿼리에 지정된 테이블 별칭은 사용되지 않습니다.) 예를 들어 다음 템플릿을 고려합니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="1">  
    SELECT FirstName as fname,  
           LastName as lname  
    FROM   Person.Contact C  
    FOR XML NESTED  
  </sql:query>  
</ROOT>  

템플릿을 실행하면 다음 XML이 생성됩니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Person.Contact fname="Gustavo" lname="Achong" />   
  <Person.Contact fname="Catherine" lname="Abel" />   
...  
</ROOT>  

열을 dbobject 쿼리로 반환하는 쿼리가 있는 경우 이러한 열에 별칭을 사용할 수 없습니다.

예를 들어 다음 템플릿을 살펴보겠습니다. 이 템플릿에서는 직원 ID와 사진을 반환하는 쿼리를 실행합니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
<sql:query client-side-xml="1">  
   SELECT ProductPhotoID, LargePhoto as P  
   FROM   Production.ProductPhoto  
   WHERE  ProductPhotoID=5  
   FOR XML NESTED, elements  
</sql:query>  
</ROOT>  

이 템플릿을 실행하면 Photo 열이 dbobject 쿼리로 반환됩니다. 이 dbobject 쿼리 @P 에서 존재하지 않는 열 이름을 참조합니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Production.ProductPhoto>  
    <ProductPhotoID>5</ProductPhotoID>  
    <LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@P</LargePhoto>  
  </Production.ProductPhoto>  
</ROOT>  

서버(client-side-xml="0")에서 XML 서식을 지정하는 경우 실제 테이블 및 열 이름이 반환되는 dbobject 쿼리를 반환하는 열의 별칭을 사용할 수 있습니다(별칭이 지정된 경우에도). 예를 들어 다음 템플릿은 쿼리를 실행하고 서버에서 XML 서식 지정이 수행됩니다( 클라이언트 쪽 xml 옵션이 지정되지 않았으며 가상 루트에 대해 클라이언트 실행 옵션이 선택되지 않음). 또한 쿼리는 AUTO 모드(클라이언트 쪽 NESTED 모드 아님)를 지정합니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
<sql:query   
   SELECT ProductPhotoID, LargePhoto as P  
   FROM   Production.ProductPhoto  
   WHERE  ProductPhotoID=5  
   FOR XML AUTO, elements  
</sql:query>  
</ROOT>  

이 템플릿을 실행하면 다음 XML 문서가 반환됩니다(큰 포토 열에 대한 dbobject 쿼리에서는 별칭이 사용되지 않음).

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Production.ProductPhoto>  
    <ProductPhotoID>5</ProductPhotoID>  
    <LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@LargePhoto</LargePhoto>  
  </Production.ProductPhoto>  
</ROOT>  

클라이언트 쪽 XPath와 서버 쪽 XPath

클라이언트 쪽 XPath 및 서버 쪽 XPath는 다음과 같은 차이점을 제외하고 동일하게 작동합니다.

  • 클라이언트 쪽 XPath 쿼리를 사용할 때 적용되는 데이터 변환은 서버 쪽 XPath 쿼리를 사용할 때 적용되는 데이터 변환과 다릅니다. 클라이언트 쪽 XPath에는 CONVERT 모드 126 대신 CAST가 사용됩니다.

  • 템플릿에서 클라이언트 쪽 xml="0"(false)을 지정하는 경우 서버 쪽 XML 서식을 요청합니다. 따라서 서버에서는 NESTED 옵션이 인식되지 않으므로 FOR XML NESTED를 지정할 수 없습니다. 이렇게 하면 오류가 발생합니다. 서버에서 인식하는 AUTO, RAW 또는 EXPLICIT 모드를 사용해야 합니다.

  • 템플릿에서 클라이언트 쪽 xml="1"(true)을 지정하는 경우 클라이언트 쪽 XML 서식을 요청합니다. 이 경우 FOR XML NESTED를 지정할 수 있습니다. FOR XML AUTO를 지정하면 템플릿에 client-side-xml="1"이 지정되어 있지만 서버 쪽에서 XML 서식이 발생합니다.

참고 항목

FOR XML 보안 고려 사항(SQLXML 4.0)
클라이언트 쪽 XML 서식 지정(SQLXML 4.0)
서버 쪽 XML 서식 지정(SQLXML 4.0)