string-length 함수(XQuery)
문자의 문자열 길이를 반환합니다.
구문
fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer
인수
- $arg
길이를 계산할 원본 문자열입니다.
주의
$arg 값이 빈 시퀀스인 경우 xs:integer 값이 0으로 반환됩니다.
값에 두 개의 서로게이트 문자로 표현된 3바이트 유니코드 문자가 포함된 경우 SQL Server는 서로게이트 문자 개수를 별개로 셉니다.
매개 변수가 없는 **string-length()**는 조건자 내에서만 사용할 수 있습니다. 예를 들어 다음 쿼리는 <ROOT> 요소를 반환합니다.
declare @x xml
set @x='<ROOT>Hello</ROOT>'
select @x.query('/ROOT[string-length()=5]')
예
이 항목에서는 AdventureWorks 데이터베이스의 다양한 xml 유형 열에 저장된 XML 인스턴스에 대한 XQuery 예를 제공합니다. 이러한 각 열에 대한 개요는 AdventureWorks 데이터베이스의 xml 데이터 형식 표시를 참조하십시오.
1. string-length() XQuery 함수를 사용하여 긴 요약 설명이 포함된 제품 검색
요약 설명이 50자 이상인 제품에 대해 다음 쿼리는 제품 ID, 요약 설명 길이 및 요약 자체인 <Summary> 요소를 검색합니다.
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' as pd)
SELECT CatalogDescription.query('
<Prod ProductID= "{ /pd:ProductDescription[1]/@ProductModelID }" >
<LongSummary SummaryLength =
"{string-length(string( (/pd:ProductDescription/pd:Summary)[1] )) }" >
{ string( (/pd:ProductDescription/pd:Summary)[1] ) }
</LongSummary>
</Prod>
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.value('string-length( string( (/pd:ProductDescription/pd:Summary)[1]))', 'decimal') > 200
이전 쿼리에서 다음을 유의하십시오.
WHERE 절의 조건은 XML 문서에 저장된 요약 설명이 200자 이상인 행만 검색합니다. 이 조건에는 value() 메서드(XML 데이터 형식)가 사용됩니다.
SELECT 절은 사용자가 원하는 XML만을 생성합니다. 이 절에서는 query() 메서드(XML 데이터 형식)를 사용하여 XML을 생성하고 XML 문서에서 데이터를 검색하기 위해 필요한 XQuery 식을 지정합니다.
다음은 결과의 일부입니다.
Result
-------------------
<Prod ProductID="19">
<LongSummary SummaryLength="214">Our top-of-the-line competition
mountain bike. Performance-enhancing options include the
innovative HL Frame, super-smooth front suspension, and
traction for all terrain.
</LongSummary>
</Prod>
...
2. string-length() XQuery 함수를 사용하여 보증 설명이 매우 짧은 제품 검색
보증 설명이 20자 미만인 제품의 경우 다음 쿼리는 제품 ID, 길이, 보증 설명 및 <Warranty> 요소 자체가 포함된 XML을 검색합니다.
보증은 제품 기능 중 하나입니다. <Features> 요소 다음에는 선택 항목인 <Warranty> 자식 요소가 옵니다.
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
for $ProdDesc in /pd:ProductDescription,
$pf in $ProdDesc/pd:Features/wm:Warranty
where string-length( string(($pf/wm:Description)[1]) ) < 20
return
<Prod >
{ $ProdDesc/@ProductModelID }
<ShortFeature FeatureDescLength =
"{string-length( string(($pf/wm:Description)[1]) ) }" >
{ $pf }
</ShortFeature>
</Prod>
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('/pd:ProductDescription')=1
이전 쿼리에서 다음을 유의하십시오.
pd 및 wm은 이 쿼리에서 사용되는 네임스페이스 접두사입니다. 이 접두사는 쿼리 중인 문서에 사용되는 동일 네임스페이스를 식별합니다.
XQuery는 중첩된 FOR 루프를 지정합니다. <ProductDescription> 요소의 ProductModelID 특성을 검색하기 때문에 외부 FOR 루프는 필수입니다. 20자 미만의 보증 기능 설명이 포함된 제품만 필요하기 때문에 내부 FOR 루프도 필수입니다.
다음은 결과의 일부입니다.
Result
-------------------------
<Prod ProductModelID="19">
<ShortFeature FeatureDescLength="15">
<wm:Warranty
xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>
<wm:Description>parts and labor</wm:Description>
</wm:Warranty>
</ShortFeature>
</Prod>
...