다음을 통해 공유


QNames 관련 함수 - expanded-QName

적용 대상: SQL Server

$paramURI 지정된 네임스페이스 URI와 $paramLocal 지정된 로컬 이름을 사용하여 xs:QName 형식의 값을 반환합니다. $paramURI 빈 문자열이거나 빈 시퀀스인 경우 네임스페이스를 나타내지 않습니다.

구문

fn:expanded-QName($paramURI as xs:string?, $paramLocal as xs:string?) as xs:QName?  

인수

$paramURI
QName의 네임스페이스 URI입니다.

$paramLocal
QName의 로컬 이름 부분입니다.

설명

다음은 expanded-QName() 함수에 적용됩니다.

  • 지정된 $paramLocal 값이 xs:NCName 형식의 올바른 어휘 형식이 아니면 빈 시퀀스가 반환되고 동적 오류를 나타냅니다.

  • xs:QName 형식에서 다른 형식으로의 변환은 SQL Server에서 지원되지 않습니다. 이 때문에 XML 생성에서 expanded-QName() 함수를 사용할 수 없습니다. 예를 들어 노드 <e> expanded-QName(...) </e>를 생성할 때는 값을 형식화하지 않아야 합니다. 이렇게 하려면 xdt:untypedAtomic으로 반환된 expanded-QName() xs:QName 형식 값을 변환해야 합니다. 앞에서 말했듯이 변환 기능은 지원되지 않습니다. 솔루션은 이 항목의 뒷부분에 있는 예제에서 제공됩니다.

  • 기존 QName 형식 값을 수정하거나 비교할 수 있습니다. 예를 들어 /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") 요소<>e의 값을 expanded-QName() 함수에서 반환한 QName과 비교합니다.

예제

이 항목에서는 데이터베이스의 다양한 xml 형식 열에 저장된 XML 인스턴스에 대한 XQuery 예제를 AdventureWorks2022 제공합니다.

A. QName 형식 노드 값 바꾸기

이 예제에서는 QName 형식의 요소 노드 값을 수정하는 방법을 보여 줍니다. 이 예제에서는 다음을 수행합니다.

  • QName 형식의 요소를 정의하는 XML 스키마 컬렉션을 만듭니다.

  • XML 스키마 컬렉션을 사용하여 xml 형식 열이 있는 테이블을 만듭니다.

  • 테이블에 XML 인스턴스를 저장합니다.

  • xml 데이터 형식의 modify() 메서드를 사용하여 인스턴스의 QName 형식 요소 값을 수정합니다. expanded-QName() 함수는 새 QName 형식 값을 생성하는 데 사용됩니다.

-- If XML schema collection (if exists)  
-- drop xml schema collection SC  
-- go  
-- Create XML schema collection  
CREATE XML SCHEMA COLLECTION SC AS N'  
<schema xmlns="http://www.w3.org/2001/XMLSchema"  
    xmlns:xs="http://www.w3.org/2001/XMLSchema"   
    targetNamespace="QNameXSD"   
      xmlns:xqo="QNameXSD" elementFormDefault="qualified">  
      <element name="Root" type="xqo:rootType" />  
      <complexType name="rootType">  
            <sequence minOccurs="1" maxOccurs="1">  
                        <element name="ElemQN" type="xs:QName" />  
            </sequence>  
      </complexType>  
</schema>'  
go  
-- Create table.  
CREATE TABLE T( XmlCol xml(SC) )  
-- Insert sample XML instnace  
INSERT INTO T VALUES ('  
<Root xmlns="QNameXSD" xmlns:ns="https://myURI">  
      <ElemQN>ns:someName</ElemQN>  
</Root>')  
go  
-- Verify the insertion  
SELECT * from T  
go  
-- Result  
<Root xmlns="QNameXSD" xmlns:ns="https://myURI">  
  <ElemQN>ns:someName</ElemQN>  
</Root>   

다음 쿼리 <ElemQN> 에서 요소 값은 표시된 대로 xml 데이터 형식의 modify() 메서드와 XML DML의 대체 값을 사용하여 바뀝니다.

-- the value.  
UPDATE T   
SET XmlCol.modify('  
  declare default element namespace "QNameXSD";   
  replace value of /Root[1]/ElemQN   
  with expanded-QName("https://myURI", "myLocalName") ')  
go  
-- Verify the result  
SELECT * from T  
go  

다음은 결과입니다. 이제 QName 형식의 요소 <ElemQN> 에 새 값이 있습니다.

<Root xmlns="QNameXSD" xmlns:ns="urn">  
  <ElemQN xmlns:p1="https://myURI">p1:myLocalName</ElemQN>  
</Root>  

다음 문은 예제에 사용된 개체를 제거합니다.

-- Cleanup  
DROP TABLE T  
go  
drop xml schema collection SC  
go  

B. expanded-QName() 함수를 사용할 때의 제한 사항 처리

확장된 QName 함수는 XML 생성에 사용할 수 없습니다. 다음 예제에서는 이것을 보여 줍니다. 이 제한을 해결하기 위해 예제에서는 먼저 노드를 삽입한 다음 노드를 수정합니다.

-- if exists drop the table T  
--drop table T  
-- go  
-- Create XML schema collection  
-- DROP XML SCHEMA COLLECTION SC  
-- go  
CREATE XML SCHEMA COLLECTION SC AS '  
<schema xmlns="http://www.w3.org/2001/XMLSchema">  
      <element name="root" type="QName" nillable="true"/>  
</schema>'  
go  
 -- Create table T with a typed xml column (using the XML schema collection)  
CREATE TABLE T (xmlCol XML(SC))  
go  
-- Insert an XML instance.  
insert into T values ('<root xmlns:a="https://someURI">a:b</root>')  
 go  
-- Verify  
SELECT *   
FROM T  

다음 시도는 다른 <root> 요소를 추가하지만 XML 생성에서 expanded-QName() 함수가 지원되지 않으므로 실패합니다.

update T SET xmlCol.modify('  
insert <root>{expanded-QName("http://ns","someLocalName")}</root> as last into / ')  
go  

이에 대한 <root> 해결 방법은 먼저 요소 값이 있는 인스턴스를 삽입한 다음 수정하는 것입니다. 이 예제에서는 요소가 삽입될 때 nil 초기 값이 <root> 사용됩니다. 이 예제의 XML 스키마 컬렉션은 요소에 대한 <root> nil 값을 허용합니다.

update T SET xmlCol.modify('  
insert <root xsi:nil="true"/> as last into / ')  
go  
-- now replace the nil value with another QName.  
update T SET xmlCol.modify('  
replace value of /root[last()] with expanded-QName("http://ns","someLocalName") ')  
go  
 -- verify   
SELECT * FROM T  
go  
-- result  
<root>b</root>  

<root xmlns:a="https://someURI">a:b</root>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p1="http://ns">p1:someLocalName</root>

다음 쿼리와 같이 QName 값을 비교할 수 있습니다. 쿼리는 값이 expanded-QName() 함수에서 반환된 QName 형식 값과 일치하는 요소만> <root반환합니다.

SELECT xmlCol.query('  
    for $i in /root  
    return  
       if ($i eq expanded-QName("http://ns","someLocalName") ) then  
          $i  
       else  
          ()')  
FROM T  

구현 제한 사항

한 가지 제한 사항이 있습니다. expanded-QName() 함수는 빈 시퀀스를 두 번째 인수로 허용하고 두 번째 인수가 올바르지 않을 때 런타임 오류를 발생시키는 대신 빈 시퀀스를 반환합니다.

참고 항목

QNames와 관련된 함수(XQuery)