Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Retorna o comprimento da cadeia de caracteres em caracteres.
Sintaxe
fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer
Argumentos
$arg
Cadeia de caracteres de origem cujo comprimento deve ser calculado.
Comentários
Se o valor de $arg for uma sequência vazia, um xs:inteiro valor de 0 será retornado.
O comportamento de pares substitutos em funções XQuery depende do nível de compatibilidade do banco de dados. Se o nível de compatibilidade for 110 ou posterior, cada par substituto é contado como um único caractere. Para níveis de compatibilidade anteriores, eles são contados como dois caracteres. Para obter mais informações, consulte Nível de compatibilidade ALTER DATABASE (Transact-SQL) e Collation and Unicode Support.
Se o valor contiver um caractere Unicode de 4 bytes representado por dois caracteres substitutos, o SQL Server contará os caracteres substitutos individualmente.
O string-length() sem um parâmetro só pode ser usado dentro de um predicado. Por exemplo, a consulta a seguir retorna o elemento <ROOT
>:
DECLARE @x xml;
SET @x='<ROOT>Hello</ROOT>';
SELECT @x.query('/ROOT[string-length()=5]');
Caracteres suplementares (pares substitutos)
O comportamento de pares substitutos em funções XQuery depende do nível de compatibilidade do banco de dados e, em alguns casos, do URI de namespace padrão para funções. Para obter mais informações, consulte a seção "XQuery Functions Are Surrogate-Aware" no tópico Alterações significativas nos recursos do mecanismo de banco de dados no SQL Server 2016. Consulte também Nível de compatibilidade ALTER DATABASE (Transact-SQL) e Collation e Unicode Support.
Exemplos
Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas xml type no banco de dados AdventureWorks.
Um. Usando a função XQuery string-length() para recuperar produtos com descrições resumidas longas
Para produtos cuja descrição de resumo é maior que 50 caracteres, a consulta a seguir recupera a ID do produto, o comprimento da descrição de resumo e o próprio resumo, o elemento <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;
Observe o seguinte da consulta anterior:
A condição na cláusula WHERE recupera apenas as linhas em que a descrição resumida armazenada no documento XML tem mais de 200 caracteres. Ele usa o método value() (tipo de dados XML).
A cláusula SELECT apenas constrói o XML desejado. Ele usa o método query() (tipo de dados XML) para construir o XML e especificar a expressão XQuery necessária para recuperar dados do documento XML.
Este é um resultado parcial:
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. Usando a função string-length() XQuery para recuperar produtos cujas descrições de garantia são curtas
Para produtos cujas descrições de garantia têm menos de 20 caracteres, a consulta a seguir recupera XML que inclui o ID do produto, o comprimento, a descrição da garantia e o próprio elemento <Warranty
>.
A garantia é uma das características do produto. Um elemento filho <Warranty
> opcional segue após o elemento <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;
Observe o seguinte da consulta anterior:
PD e WM são os prefixos de namespace usados nesta consulta. Eles identificam os mesmos namespaces usados no documento que está sendo consultado.
O XQuery especifica um loop FOR aninhado. O loop FOR externo é necessário, porque você deseja recuperar os atributos ProductModelID do elemento <
ProductDescription
>. O loop FOR interno é necessário, porque você deseja apenas os produtos que têm descrições de recursos de garantia com menos de 20 caracteres.
Este é o resultado parcial:
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>
...