expanded-QName(XQuery)
$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 유형에 맞는 어휘로 구성되지 않은 경우 빈 시퀀스가 반환되어 동적 오류를 나타냅니다.
SQL Server에서는 xs:QName 유형을 다른 유형으로 변환할 수 없습니다. 따라서 XML 생성에 expanded-QName() 함수를 사용할 수 없습니다. 예를 들어 <e> expanded-QName(…) </e>과 같은 노드를 생성할 때 값은 형식화되지 않아야 합니다. 형식화되면 expanded-QName()이 반환한 xs:QName 유형 값을 xdt:untypedAtomic으로 변환해야 하기 때문입니다. 앞에서 말했듯이 변환 기능은 지원되지 않습니다. 해결 방법은 이 항목 뒷부분의 예에 나와 있습니다.
기존의 QName 유형 값을 수정하거나 비교할 수 있습니다. 예를 들어 /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS")은 <e> 요소의 값을 expanded-QName() 함수가 반환한 QName과 비교합니다.
예
이 항목에서는 AdventureWorks 데이터베이스의 다양한 xml 유형 열에 저장된 XML 인스턴스에 대한 XQuery 예를 보여 줍니다. 이러한 각 열에 대한 개요는 AdventureWorks 데이터베이스의 xml 데이터 형식 표시를 참조하십시오.
1. 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="http://myURI">
<ElemQN>ns:someName</ElemQN>
</Root>')
go
-- Verify the insertion
SELECT * from T
go
-- Result
<Root xmlns="QNameXSD" xmlns:ns="http://myURI">
<ElemQN>ns:someName</ElemQN>
</Root>
다음 쿼리에서는 xml 데이터 유형의 modify() 메서드와 XML DML의 대체 값을 사용하여 <ElemQN> 요소 값이 바뀝니다.
-- the value.
UPDATE T
SET XmlCol.modify('
declare default element namespace "QNameXSD";
replace value of /Root[1]/ElemQN
with expanded-QName("http://myURI", "myLocalName") ')
go
-- Verify the result
SELECT * from T
go
다음은 결과입니다. QName 유형의 <ElemQN> 요소에 새로운 값이 있습니다.
<Root xmlns="QNameXSD" xmlns:ns="urn">
<ElemQN xmlns:p1="http://myURI">p1:myLocalName</ElemQN>
</Root>
다음 문에서는 예에 사용된 개체를 제거합니다.
-- Cleanup
DROP TABLE T
go
drop xml schema collection SC
go
2. expanded-QName() 함수 사용 시 제한 사항 해결
XML 생성에 expanded-QName 함수를 사용할 수 없습니다. 다음은 이에 대한 예입니다. 이 제한 사항을 해결하기 위해 이 예에서는 먼저 노드를 삽입한 다음 해당 노드를 수정합니다.
-- 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="http://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> 요소의 값으로 인스턴스를 삽입한 다음 수정하는 것입니다. 이 예에서는 <root> 요소를 삽입할 때 nil 초기 값이 사용됩니다. 이 예의 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="http://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() 함수는 빈 시퀀스를 두 번째 인수로 허용하므로 두 번째 인수가 올바르지 않으면 런타임 오류를 발생시키지 않고 빈 시퀀스를 반환합니다.