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() 함수는 빈 시퀀스를 두 번째 인수로 허용하고 두 번째 인수가 올바르지 않을 때 런타임 오류를 발생시키는 대신 빈 시퀀스를 반환합니다.