Share via


FOR XML 절 사용을 위한 지침

FOR XML 절은 최상위 쿼리 및 하위 쿼리에서 사용할 수 있습니다. 최상위 FOR XML 절은 SELECT 문에서만 사용할 수 있습니다. 하위 쿼리에서는 INSERT, UPDATE 및 DELETE 문에서 FOR XML을 사용할 수 있습니다. 또한 대입 문에서도 사용할 수 있습니다. 예를 들면 다음과 같습니다.

DECLARE @x xml
SET @x = (SELECT *
FROM Sales.Customer
FOR XML AUTO, TYPE)
SELECT @x

TYPE 지시어는 쿼리 결과를 xml 유형으로 반환합니다. 유형 지시어가 추가되지 않은 경우 FOR XML 쿼리 결과는 **nvarchar(max)**로 반환됩니다. 그런 다음 xml로 변환되고 xml 유형의 변수로 할당됩니다.

FOR XML 절은 다음 제한 사항의 영향을 받습니다.

  • FOR XML은 COMPUTE BY 또는 FOR BROWSE 절과 함께 사용하는 모든 선택에 대해서는 유효하지 않습니다. 예를 들어 다음은 오류를 일으킵니다.

    SELECT TOP 5 SalesOrderID, UnitPrice 
    FROM Sales.SalesOrderDetail 
    ORDER BY SalesOrderID COMPUTE SUM(UnitPrice) BY SalesOrderID
    FOR XML AUTO
    
  • TYPE 지시어가 없는 최상위 FOR XML은 커서와 함께 사용할 수 없습니다.

  • FOR XML 절이 있는 SELECT 명령문이 쿼리에서 네 부분으로 된 이름을 지정할 경우, 로컬 컴퓨터에서 쿼리를 실행하면 서버 이름이 결과 XML 문서에 반환되지 않습니다. 그러나 쿼리를 네트워크 서버에서 실행하면 서버 이름은 네 부분으로 된 이름으로 반환됩니다.
    예를 들어 다음과 같은 쿼리를 고려할 수 있습니다.

    SELECT TOP 1 LastName
    FROM ServerName.AdventureWorks.Person.Contact
    FOR XML AUTO
    

    ServerName이 로컬 서버면 쿼리는 다음을 반환합니다.

    <AdventureWorks.Person.Contact LastName="Achong" />
    

    ServerName이 네트워크 서버면 쿼리는 다음을 반환합니다.

    <ServerName.AdventureWorks.Person.Contact LastName="Achong" />
    

    다음과 같이 별칭을 지정하면 이러한 잠재적 모호성을 방지할 수 있습니다.

    SELECT TOP 1 LastName
    FROM ServerName.AdventureWorks.Person.Contact x
    FOR XML AUTO 
    

    이 쿼리는 다음과 같은 결과를 반환합니다.

    <x LastName="Achong"/>
    

또한, XML 이름으로 유효하지 않은 문자(예: 공백)가 포함된 SQL Server 이름은 유효하지 않은 문자가 이스케이프 숫자 엔터티 인코딩으로 변환되는 방식으로 XML 이름으로 변환됩니다.

XML 이름에 사용할 수 있는 알파벳이 아닌 문자는 콜론(:)과 밑줄(_) 두 개뿐입니다. 콜론은 네임스페이스용으로 이미 예약된 문자이므로 이스케이프 문자로는 밑줄이 선택되었습니다. 다음은 인코딩에 사용되는 이스케이프 규칙입니다.

  • XML 1.0 사양에 따라 유효한 XML 이름 문자가 아닌 모든 UCS-2 문자는 _xHHHH_로 이스케이프됩니다. HHHH는 해당 문자에 대한 최상위 비트 우선 순서의 4자리 16진수 UCS-2 코드를 나타냅니다. 예를 들어 테이블 이름 Order Details는 Order_x0020_Details로 인코딩됩니다.

  • UCS-2 영역(U+0010FFFF에 U+00010000 범위의 USC-4 추가)은 _xHHHHHHHH_로 인코딩됩니다. HHHHHHHH는 SQL Server 2000 이전 버전과의 호환성 모드인 경우 해당 문자에 대한 8자리 16진수 UCS-4 인코딩을 나타냅니다. 그렇지 않으면 SQL 2003 표준에 맞도록 문자가 _xHHHHHH_로 인코딩됩니다.

  • 문자 x가 뒤에 이어지지 않는 경우에는 밑줄 문자를 이스케이프 처리하지 않아도 됩니다. 예를 들어, 테이블 이름 Order_Details는 인코딩되지 않습니다.

  • 식별자에서 콜론은 이스케이프 처리되지 않으므로 네임스페이스 요소와 특성 이름이 FOR XML 쿼리에 의해 생성될 수 있습니다. 예를 들어 다음 쿼리는 이름에 콜론이 있는 네임스페이스 특성을 생성합니다.

    SELECT 'namespace-urn' as 'xmlns:namespace', 
     1 as 'namespace:a' 
    FOR XML RAW
    

    쿼리 결과는 다음과 같습니다.

    <row xmlns:namespace="namespace-urn" namespace:a="1"/>
    

    XML 네임스페이스를 추가할 때는 WITH XMLNAMESPACES를 사용하는 것이 좋습니다.

  • SELECT 쿼리에서 모든 열에 BLOB에 대한 형변환을 지정하면 임시 엔터티가 되어 관련 테이블 이름과 열 이름이 손실됩니다. 이것은 XML 계층 구조에서 이 값을 둘 위치를 알 수 없으므로, 이로 인해 AUTO 모드 쿼리에서 오류가 발생하게 됩니다. 예를 들면 다음과 같습니다.

    CREATE TABLE MyTable (Col1 int PRIMARY KEY, Col2 binary)
    INSERT INTO MyTable VALUES (1, 0x7)
    

    다음 쿼리에서는 BLOB(Binary Large Object)으로 형변환하기 때문에 오류가 발생합니다.

    SELECT Col1,
    CAST(Col2 as image) as Col2
    FROM MyTable
    FOR XML AUTO
    

    이 솔루션은 FOR XML 절에 BINARY BASE64 옵션을 추가합니다. 형변환 지정을 없애면 예상대로 쿼리 결과가 만들어집니다.

    SELECT Col1,
    Col2
    FROM MyTable
    FOR XML AUTO
    

    다음은 결과입니다.

    <MyTable Col1="1" Col2="dbobject/MyTable[@Col1='1']/@Col2" />
    
  • SQL Server 2000에서는 FOR XML 출력에 잘못된 XML 문자가 포함될 수 있습니다. 예를 들어 16진수 값 7은 문자 형식으로 사용되지만 그 외 경우에는 일반적으로 출력에서 텍스트로 표시되지 않습니다. SQL Server 2005 는 TYPE 지시어를 사용하지 않는 FOR XML 쿼리 내에서 이러한 문자가 반환되는 경우 문자를 엔터티화합니다.
    이러한 문자는 엔터티화되었는지 여부에 관계없이 XML 1.0 호환 파서에서 구문 분석 오류를 발생시키지만 엔터티화된 형식은 XML 1.1에 보다 적합합니다. 엔터티화된 형식은 또한 이후 버전의 XML 표준에도 적합할 가능성이 높습니다. 또한 잘못된 문자의 코드 지점이 가시적으로 표시되기 때문에 보다 쉽게 디버깅을 수행할 수 있습니다.
    XML 도구 사용자의 경우에는 데이터 스트림에 잘못된 문자가 있으면 어떤 방식으로든 XML 파서가 실패하기 때문에 해결 방법이 필요하지 않습니다. 비-XML 도구를 사용하는 경우 이러한 변경 내용을 적용하려면 엔터티화된 값으로 이러한 문자를 검색할 수 있도록 프로그래밍 논리를 업데이트해야 합니다.

  • SQL Server 2005 에서 다음 공백 문자는 왕복 중에 해당 문자를 보존할 수 있도록 FOR XML 쿼리에서 다르게 엔터티화됩니다.

    • 요소 내용 및 특성의 경우: hex(0D)(캐리지 리턴)
    • 특성 내용의 경우: hex(09)(탭), hex(0A)(줄 바꿈)

    이러한 문자가 정규화된 SQL Server 2000 출력을 처리하도록 디자인된 응용 프로그램의 경우에는 영향을 받을 수 있습니다. SQL Server 2005 출력에서는 이제 이러한 문자가 유지되며 파서에서 문자를 정규화하지 않습니다.

참고 항목

참조

FOR XML을 사용하는 XML 생성

관련 자료

SELECT(Transact-SQL)

도움말 및 정보

SQL Server 2005 지원 받기