exist() 메서드(xml 데이터 형식)
다음 경우 중 하나를 나타내는 bit를 반환합니다.
쿼리의 XQuery 식이 비어 있지 않은 결과를 반환하면 True를 나타내는 1입니다. 즉 하나 이상의 XML 노드를 반환합니다.
빈 결과를 반환하면 False를 나타내는 0입니다.
쿼리가 실행된 xml 데이터 형식 인스턴스에 NULL이 있으면 NULL입니다.
[!참고]
exist() 메서드는 비어 있지 않은 결과를 반환하는 XQuery 식에 대해 1을 반환합니다. exist() 메서드 내에서 true() 또는 false() 함수를 지정하면 true() 및 false() 함수가 각각 부울 값인 True와 False를 반환하기 때문에 exist() 메서드가 1을 반환합니다. 즉, 이들 함수는 비어 있지 않은 결과를 반환합니다. 따라서 exist()는 다음 예에서와 같이 1(True)을 반환합니다.
declare @x xml
set @x=''
select @x.exist('true()')
구문
exist (XQuery)
인수
- XQuery
문자열 리터럴인 XQuery 식입니다.
예
다음 예에서는 exist() 메서드를 지정하는 방법을 보여 줍니다.
예: xml 형식의 변수에 대해 exist() 메서드 지정
다음 예에서 @x는 xml 유형 변수(형식화되지 않은 xml)이고 @f는 exist() 메서드에서 반환한 값을 저장하는 정수 유형 변수입니다. XML 인스턴스에 저장된 날짜 값이 2002-01-01이면 exist() 메서드가 True(1)를 반환합니다.
declare @x xml
declare @f bit
set @x = '<root Somedate = "2002-01-01Z"/>'
set @f = @x.exist('/root[(@Somedate cast as xs:date?) eq xs:date("2002-01-01Z")]')
select @f
exist() 메서드의 날짜를 비교할 때 다음에 유의하십시오.
비교를 위해 값을 xs:date 유형으로 캐스팅하는 데 cast as xs:date? 코드가 사용됩니다.
@Somedate 특성의 값은 형식화되지 않습니다. 이 값을 비교할 때 암시적으로 오른쪽에 있는 형식인 xs:date 유형으로 캐스팅됩니다.
cast as xs:date() 대신 xs:date() 생성자 함수를 사용할 수 있습니다. 자세한 내용은 생성자 함수(XQuery)를 참조하십시오.
다음 예는 <Somedate> 요소가 있다는 점을 제외하고 앞의 예와 비슷합니다.
DECLARE @x xml
DECLARE @f bit
SET @x = '<Somedate>2002-01-01Z</Somedate>'
SET @f = @x.exist('/Somedate[(text()[1] cast as xs:date ?) = xs:date("2002-01-01Z") ]')
SELECT @f
이전 쿼리에서 다음을 유의하십시오.
- text() 메서드는 형식화되지 않은 값 2002-01-01을 포함하는 텍스트 노드를 반환합니다. XQuery 형식은 xdt:untypedAtomic입니다. 이 경우 암시적 캐스트가 지원되지 않으므로 x에서 xsd:date로 이 형식화된 값을 명시적으로 캐스팅해야 합니다.
예: 형식화된 xml 변수에 대해 exist() 메서드 지정
다음 예에서는 xml 유형 변수에 대해 exist() 메서드를 사용하는 방법을 보여 줍니다. 이 메서드는 스키마 네임스페이스 컬렉션 이름인 ManuInstructionsSchemaCollection을 지정하므로 형식화된 XML 변수입니다.
다음 예에서는 제조 지침 문서를 이 변수에 할당한 다음 exist() 메서드를 사용하여 LocationID 특성 값이 50인 Location> 요소가 문서에 있는지 확인합니다.
제조 지침 문서에 LocationID=50을 가진 <Location> 요소가 포함되면 @x 변수에 대해 지정된 exist() 메서드가 1(True)을 반환합니다. 그렇지 않으면 메서드가 0(False)을 반환합니다.
DECLARE @x xml (Production.ManuInstructionsSchemaCollection)
SELECT @x=Instructions
FROM Production.ProductModel
WHERE ProductModelID=67
--SELECT @x
DECLARE @f int
SET @f = @x.exist(' declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/AWMI:root/AWMI:Location[@LocationID=50]
')
SELECT @f
예: xml 형식의 열에 대해 exist() 메서드 지정
다음 쿼리에서는 카탈로그 설명에 사양 <Specifications> 요소가 없는 제품 모델 ID를 검색합니다.
SELECT ProductModelID, CatalogDescription.query('
declare namespace pd="https://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="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/pd:ProductDescription[not(pd:Specifications)]'
) = 1
이전 쿼리에서 다음을 유의하십시오.
WHERE 절은 CatalogDescription xml 유형 열에 대해 지정된 조건을 만족하는 ProductDescription 테이블의 행만 선택합니다.
XML에 <Specifications> 요소가 없으면 WHERE 절의 exist() 메서드가 1(True)을 반환합니다. not() 함수(XQuery) 사용에 유의하십시오.
비-XML 열에서 값을 가져오기 위해 sql:column() 함수(XQuery)가 사용됩니다.
이 쿼리는 빈 행 집합을 반환합니다.
쿼리에서 xml 데이터 형식의 query() 및 exist() 메서드를 지정하고 두 메서드는 쿼리 프롤로그에 같은 네임스페이스를 선언합니다. 이 경우 WITH XMLNAMESPACES를 사용하여 접두사를 선언하고 이 접두사를 쿼리에 사용할 수 있습니다.
WITH XMLNAMESPACES ('https://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[not(pd:Specifications)]'
) = 1
참고 항목
개념
WITH XMLNAMESPACES를 사용하여 쿼리에 네임스페이스 추가