적용 대상:SQL Server
문자열의 길이를 문자로 반환합니다.
구문
fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer
인수
$arg
길이를 계산할 원본 문자열입니다.
설명
$arg 값이 빈 시퀀스이면 xs:integer 값 0이 반환됩니다.
XQuery 함수에서 서로게이트 쌍의 동작은 데이터베이스 호환성 수준에 따라 달라집니다. 호환성 수준이 110 이상인 경우 각 서로게이트 쌍은 단일 문자로 계산됩니다. 이전 호환성 수준의 경우 두 문자로 계산됩니다. 자세한 내용은 호환성 수준(Transact-SQL)과 정렬 및 유니코드 지원을 참조하세요ALTER DATABASE.
값에 두 개의 서로게이트 문자로 표시되는 4 바이트 유니코드 문자가 포함된 경우 SQL Server는 서로게이트 문자를 개별적으로 계산합니다.
매개 변수가 없는 string-length()는 조건자 내에서만 사용할 수 있습니다. 예를 들어 다음 쿼리는 요소를 반환합니다 <ROOT> .
DECLARE @x xml;
SET @x='<ROOT>Hello</ROOT>';
SELECT @x.query('/ROOT[string-length()=5]');
보조 문자(서로게이트 쌍)
XQuery 함수에서 서로게이트 쌍의 동작은 데이터베이스 호환성 수준 및 경우에 따라 함수의 기본 네임스페이스 URI에 따라 달라집니다. 자세한 내용은 호환성 수준(Transact-SQL)과 정렬 및 유니코드 지원을 참조하세요ALTER DATABASE.
예제
이 항목에서는 AdventureWorks 데이터베이스의 다양한 xml 형식 열에 저장된 XML 인스턴스에 대한 XQuery 예제를 제공합니다.
A. 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만 생성합니다. 쿼리() 메서드(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>
...
B. string-length() XQuery 함수를 사용하여 보증 설명이 짧은 제품 검색
보증 설명이 20자 미만인 제품의 경우 다음 쿼리는 제품 ID, 길이, 보증 설명 및 요소 자체를 포함하는 XML을 <Warranty> 검색합니다.
보증은 제품 기능 중 하나입니다. 선택적 <Warranty> 자식 요소는 요소 뒤에 잇습니다 <Features> .
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 루프를 지정합니다. 요소의 ProductModelID 특성을 검색 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>
...