WITH XMLNAMESPACES를 사용하여 쿼리에 네임스페이스 추가Add Namespaces to Queries with WITH XMLNAMESPACES

WITH XMLNAMESPACES(Transact-SQL) 는 다음과 같은 방식으로 네임스페이스 URI를 지원합니다.WITH XMLNAMESPACES (Transact-SQL) provides namespace URI support in the following way:

FOR XML 쿼리에서 WITH XMLNAMESPACES 사용Using WITH XMLNAMESPACES in the FOR XML Queries

WITH XMLNAMESPACES를 사용하면 FOR XML 쿼리에 XML 네임스페이스를 포함시킬 수 있습니다.WITH XMLNAMESPACES lets you include XML namespaces in FOR XML queries. 예를 들어 다음 FOR XML 쿼리를 참조하십시오.For example, consider the following FOR XML query:

SELECT ProductID, Name, Color  
FROM   Production.Product  
WHERE  ProductID=316 or ProductID=317  
FOR XML RAW  

다음은 결과입니다.This is the result:

<row ProductID="316" Name="Blade" />  
<row ProductID="317" Name="LL Crankarm" Color="Black" />  

FOR XML 쿼리에 의해 생성된 XML에 네임스페이스를 추가하려면 먼저 WITH NAMESPACES 절을 사용하여 URI 매핑에 네임스페이스 접두사를 지정합니다.To add namespaces to the XML constructed by the FOR XML query, first specify the namespace prefix to URI mappings by using the WITH NAMESPACES clause. 그런 다음 수정된 다음 쿼리에 표시된 것과 같이 쿼리에 네임스페이스를 지정할 때 네임스페이스 접두사를 사용합니다.Then, use the namespace prefixes in specifying the names in the query as shown in the following modified query. WITH XMLNAMESPACES 절은 URI(ns1) 매핑에 대해 네임스페이스 접두사(uri)를 지정합니다.Note that the WITH XMLNAMESPACES clause specifies the namespace prefix (ns1) to URI (uri) mapping. ns1 접두사는 FOR XML 쿼리에 의해 생성되는 요소 및 특성 이름을 지정하는 데 사용됩니다.The ns1 prefix is then used in specifying the element and attribute names to be constructed by the FOR XML query.

WITH XMLNAMESPACES ('uri' as ns1)  
SELECT ProductID as 'ns1:ProductID',  
       Name      as 'ns1:Name',   
       Color     as 'ns1:Color'  
FROM Production.Product  
WHERE ProductID=316 or ProductID=317  
FOR XML RAW ('ns1:Prod'), ELEMENTS  

XML 결과에는 네임스페이스 접두사가 포함됩니다.The XML result includes the namespace prefixes:

<ns1:Prod xmlns:ns1="uri">  
  <ns1:ProductID>316</ns1:ProductID>  
  <ns1:Name>Blade</ns1:Name>  
</ns1:Prod>  
<ns1:Prod xmlns:ns1="uri">  
  <ns1:ProductID>317</ns1:ProductID>  
  <ns1:Name>LL Crankarm</ns1:Name>  
  <ns1:Color>Black</ns1:Color>  
</ns1:Prod>  

다음은 WITH XMLNAMESPACES 절에 적용됩니다.The following applies to the WITH XMLNAMESPACES clause:

  • FOR XML 쿼리의 RAW, AUTO 및 PATH 모드에서만 지원됩니다.It is supported only on the RAW, AUTO, and PATH modes of the FOR XML queries. EXPLICIT 모드는 지원되지 않습니다.The EXPLICIT mode is not supported.

  • FOR XML 쿼리의 네임스페이스 접두사와 xml 데이터 형식 메서드에만 영향을 주고 XML 파서에는 영향을 주지 않습니다.It only affects the namespace prefixes of FOR XML queries and the xml data type methods, but not the XML parser. 예를 들어 다음 쿼리는 XML 문서에 myNS 접두사에 대한 네임스페이스 선언이 없기 때문에 오류를 반환합니다.For example, the following query returns an error, because the XML document has no namespace declaration for the myNS prefix.

  • WITH XMLNAMESPACES 절을 사용하는 경우 FOR XML 지시어, XMLSCHEMA 및 XMLDATA는 사용할 수 없습니다.The FOR XML directives, XMLSCHEMA and XMLDATA cannot be used when a WITH XMLNAMESPACES clause is being used.

    CREATE TABLE T (x xml)  
    go  
    WITH XMLNAMESPACES ('http://abc' as myNS )  
    INSERT INTO T VALUES('<myNS:root/>')  
    

XSINIL 지시어 사용Using the XSINIL Directive

ELEMENTS XSINIL 지시어를 사용할 때는 WITH XMLNAMESPACES 절에서 xsi 접두사를 정의할 수 없습니다.You cannot define the xsi prefix in the WITH XMLNAMESPACES clause if you are using the ELEMENTS XSINIL directive. 대신 ELEMENTS XSINIL을 사용할 때 자동으로 추가됩니다.Instead, it is added automatically when you use ELEMENTS XSINIL. 다음 쿼리에서는 xsi:nil 특성이 True로 설정된 요소에 Null 값이 매핑되는 요소 중심 XML을 생성하는 ELEMENTS XSINIL을 사용합니다.The following query uses ELEMENTS XSINIL that generates element-centric XML where null values are mapped to elements that have the xsi:nil attribute set to True.

WITH XMLNAMESPACES ('uri' as ns1)  
SELECT ProductID as 'ns1:ProductID',  
       Name      as 'ns1:Name',   
       Color     as 'ns1:Color'  
FROM Production.Product  
WHERE ProductID=316   
FOR XML RAW, ELEMENTS XSINIL  

다음은 결과입니다.This is the result:

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="uri">  
  <ns1:ProductID>316</ns1:ProductID>  
  <ns1:Name>Blade</ns1:Name>  
  <ns1:Color xsi:nil="true" />  
</row>  

기본 네임스페이스 지정Specifying Default Namespaces

네임스페이스 접두사를 선언하는 대신 DEFAULT 키워드를 사용하여 기본 네임스페이스를 선언할 수 있습니다.Instead of declaring a namespace prefix, you can declare a default namespace by using a DEFAULT keyword. FOR XML 쿼리에서 기본 네임스페이스를 결과 XML의 XML 노드에 바인딩합니다.In the FOR XML query, it will bind the default namespace to XML nodes in the resulting XML. 다음 예에서 WITH XMLNAMESPACES는 기본 네임스페이스와 함께 정의된 두 개의 네임스페이스 접두사를 정의합니다.In the following example, the WITH XMLNAMESPACES defines two namespace prefixes that are defined together with a default namespace.

WITH XMLNAMESPACES ('uri1' as ns1,   
                    'uri2' as ns2,  
                    DEFAULT 'uri2')  
SELECT ProductID,   
      Name,  
      Color  
FROM Production.Product   
WHERE ProductID=316 or ProductID=317  
FOR XML RAW ('ns1:Product'), ROOT('ns2:root'), ELEMENTS  

FOR XML 쿼리는 요소 중심 XML을 생성합니다.The FOR XML query generates element-centric XML. 쿼리는 노드 이름 지정 시에 두 네임스페이스 접두사를 모두 사용합니다.Note that the query uses both the namespace prefixes in naming nodes. SELECT 절에서 ProductID, Name 및 Color는 접두사가 포함된 이름을 지정하지 않습니다.In the SELECT clause, the ProductID, Name, and Color do not specify a name with any prefix. 따라서 결과 XML의 해당 요소는 기본 네임스페이스에 속합니다.Therefore, the corresponding elements in the resulting XML belong to the default namespace.

<ns2:root xmlns="uri2" xmlns:ns2="uri2" xmlns:ns1="uri1">  
  <ns1:Product>  
    <ProductID>316</ProductID>  
    <Name>Blade</Name>  
  </ns1:Product>  
  <ns1:Product>  
    <ProductID>317</ProductID>  
    <Name>LL Crankarm</Name>  
    <Color>Black</Color>  
  </ns1:Product>  
</ns2:root>  

다음 쿼리는 이전 쿼리와 비슷하지만 FOR XML AUTO 모드가 지정되어 있습니다.The following query is similar to the previous one, except that the FOR XML AUTO mode is specified.

WITH XMLNAMESPACES ('uri1' as ns1,  'uri2' as ns2,DEFAULT 'uri2')  
SELECT ProductID,   
      Name,  
      Color  
FROM Production.Product as "ns1:Product"  
WHERE ProductID=316 or ProductID=317  
FOR XML AUTO, ROOT('ns2:root'), ELEMENTS  

미리 정의된 네임스페이스 사용Using Predefined Namespaces

ELEMENTS XSINIL이 사용되는 경우의 xml 네임스페이스 및 xsi 네임스페이스를 제외한 미리 정의된 네임스페이스를 사용하는 경우 WITH XMLNAMESPACES를 사용하여 네임스페이스 바인딩을 명시적으로 지정해야 합니다.When you use predefined namespaces, except the xml namespace and the xsi namespace when ELEMENTS XSINIL is used, you must explicitly specify the namespace binding by using WITH XMLNAMESPACES. 다음 쿼리는 미리 정의된 네임스페이스에 대해 URI 바인딩에 대한 네임스페이스 접두사를 명시적으로 정의합니다(urn:schemas-microsoft-com:xml-sql).The following query explicitly defines the namespace prefix to URI binding for the predefined namespace (urn:schemas-microsoft-com:xml-sql).

WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-sql' as sql)  
SELECT 'SELECT * FROM Customers FOR XML AUTO, ROOT("a")' AS "sql:query"  
FOR XML PATH('sql:root')  

다음은 결과입니다.This is the result. SQLXML 사용자는 이러한 XML 템플릿에 익숙합니다.SQLXML users are familiar with this XML template. 자세한 내용은 SQLXML 4.0 프로그래밍 개념을 참조하세요.For more information, see SQLXML 4.0 Programming Concepts.

<sql:root xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query>SELECT * FROM Customers FOR XML AUTO, ROOT("a")</sql:query>  
</sql:root>  

다음 PATH 모드 쿼리에 표시된 것과 같이 WITH XMLNAMESPACES에 명시적으로 정의할 필요 없이 xml 네임스페이스 접두사만 사용할 수 있습니다.Only the xml namespace prefix can be used without explicitly defining it in WITH XMLNAMESPACES, as shown in the following PATH mode query. 또한 접두사가 선언된 경우 네임스페이스 http://www.w3.org/XML/1998/namespace에 바인딩되어야 합니다.Also, if the prefix is declared, it has to be bound to the namespace http://www.w3.org/XML/1998/namespace. SELECT 절에 지정된 이름은 WITH XMLNAMESPACES를 사용하여 명시적으로 정의되지 않은 xml 네임스페이스 접두사를 참조합니다.The names specified in the SELECT clause refer to the xml namespace prefix that is not explicitly defined by using WITH XMLNAMESPACES.

SELECT 'en'    as "English/@xml:lang",  
       'food'  as "English",  
       'ger'   as "German/@xml:lang",  
       'Essen' as "German"  
FOR XML PATH ('Translation')  
go  

@xml:lang 특성은 미리 정의된 xml 네임스페이스를 사용합니다.The @xml:lang attributes use the predefined xml namespace. XML 버전 1.0에는 xml 네임스페이스 바인딩에 대한 명시적 선언이 필요하지 않기 때문에 결과에는 네임스페이스 바인딩의 명시적 선언이 포함되지 않습니다.Because XML version 1.0 does not require the explicit declaration of the xml namespace binding, the result will not include an explicit declaration of the namespace binding.

다음은 결과입니다.This is the result:

<Translation>  
  <English xml:lang="en">food</English>  
  <German xml:lang="ger">Essen</German>  
</Translation>  

xml 데이터 형식 메서드에서 WITH XMLNAMESPACES 사용Using WITH XMLNAMESPACES with the xml Data Type Methods

modify() 메서드인 경우 SELECT 쿼리 또는 UPDATE에 지정된 xml 데이터 형식 메서드 는 모두 해당 프롤로그에서 네임스페이스 선언을 반복해야 합니다.The xml Data Type Methods specified in a SELECT query, or in UPDATE when it is the modify() method, all have to repeat the namespace declaration in their prolog. 이 작업은 시간이 많이 걸리는 작업입니다This can be time-consuming. 예를 들어 다음 쿼리는 카탈로그 설명에 사양이 포함되지 않는 제품 모델 ID를 검색합니다.For example, the following query retrieves product model IDs whose catalog descriptions do include specification. 즉, <Specifications> 요소가 있습니다.That is, the <Specifications> element exists.

SELECT ProductModelID, CatalogDescription.query('  
declare namespace pd="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
    <Product   
        ProductModelID= "{ sql:column("ProductModelID") }"   
        />  
') AS Result  
FROM Production.ProductModel  
WHERE CatalogDescription.exist('  
    declare namespace  pd="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     /pd:ProductDescription[(pd:Specifications)]'  
    ) = 1  

이전 쿼리에서 query()exist() 메서드는 모두 해당 프롤로그에서 같은 네임스페이스를 선언합니다.In the previous query, both the query() and exist() methods declare the same namespace in their prolog. 예를 들어For example:

declare namespace pd="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  

또는 WITH XMLNAMESPACES를 먼저 선언하고 쿼리에 있는 네임스페이스 접두사를 사용할 수 있습니다.Alternatively, you can declare WITH XMLNAMESPACES first and use the namespace prefixes in the query. 이 경우 query()exist() 메서드는 해당 프롤로그에 네임스페이스 선언을 포함시킬 필요가 없습니다.In this case, the query() and exist() methods do not have to include namespace declarations in their prolog.

WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' as pd)  
SELECT ProductModelID, CatalogDescription.query('  
    <Product   
        ProductModelID= "{ sql:column("ProductModelID") }"   
        />  
') AS Result  
FROM Production.ProductModel  
WHERE CatalogDescription.exist('  
     /pd:ProductDescription[(pd:Specifications)]'  
    ) = 1  
Go  

XQuery 프롤로그에 있는 명시적 선언은 네임스페이스 접두사와 WITH 절에 정의된 기본 요소 네임스페이스를 무시합니다.Note that an explicit declaration in the XQuery prolog overrides the namespace prefix and the default element namespace that are defined in the WITH clause.

참고 항목See Also

xml 데이터 형식 메서드 xml Data Type Methods
XQuery 언어 참조(SQL Server) XQuery Language Reference (SQL Server)
WITH XMLNAMESPACES(Transact-SQL) WITH XMLNAMESPACES (Transact-SQL)
FOR XML(SQL Server)FOR XML (SQL Server)