Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Vrátí délku řetězce v značce.
Syntax
fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer
Argumenty
$arg
Zdrojový řetězec, jehož délka se má vypočítat.
Poznámky
Pokud je hodnota $arg prázdná sekvence, vrátí se xs:integer hodnota 0.
Chování náhradních párů ve funkcích XQuery závisí na úrovni kompatibility databáze. Pokud je úroveň kompatibility 110 nebo novější, počítá se každý náhradní pár jako jeden znak. U dřívějších úrovní kompatibility se započítávají jako dva znaky. Další informace naleznete v tématu ALTER DATABASE Compatibility Level (Transact-SQL) a kolace a podporu kódování Unicode.
Pokud hodnota obsahuje 4 bajtový znak Unicode, který je reprezentován dvěma náhradními znaky, SQL Server spočítá náhradní znaky jednotlivě.
string-length() bez parametru lze použít pouze uvnitř predikátu. Například následující dotaz vrátí prvek <ROOT
>:
DECLARE @x xml;
SET @x='<ROOT>Hello</ROOT>';
SELECT @x.query('/ROOT[string-length()=5]');
Doplňkové znaky (náhradní dvojice)
Chování náhradních párů ve funkcích XQuery závisí na úrovni kompatibility databáze a v některých případech na výchozím identifikátoru URI oboru názvů pro funkce. Další informace najdete v části Funkce XQuery Jsou náhradní funkce v tématu Zásadní změny funkcí databázového stroje v SQL Serveru 2016. Viz také úroveň kompatibility ALTER DATABASE (Transact-SQL) a kolace a podporu kódování Unicode.
Příklady
Toto téma obsahuje příklady XQuery pro instance XML uložené v různých xml sloupce typu v databázi AdventureWorks.
A. Použití funkce XQuery string-length() k načtení produktů s dlouhými souhrnnými popisy
Pro produkty, jejichž souhrnný popis je větší než 50 znaků, následující dotaz načte ID produktu, délku souhrnného popisu a samotný souhrn <Summary
> prvek.
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;
Všimněte si následujících věcí z předchozího dotazu:
Podmínka v klauzuli WHERE načte pouze řádky, ve kterých je souhrnný popis uložený v dokumentu XML delší než 200 znaků. Používá metodu value() (datový typ XML).
Klauzule SELECT pouze vytvoří požadovaný kód XML. Používá metodu query() (datový typ XML) k vytvoření XML a zadání potřebného výrazu XQuery k načtení dat z dokumentu XML.
Jedná se o částečný výsledek:
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. Použití funkce XQuery string-length() k načtení produktů, jejichž popisy záruk jsou krátké
Pro produkty, jejichž popisy záruk jsou kratší než 20 znaků, následující dotaz načte KÓD XML, který obsahuje ID produktu, délku, popis záruky a samotný prvek <Warranty
>.
Záruka je jednou z funkcí produktu. Volitelný podřízený prvek <Warranty
> následuje za elementem <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;
Všimněte si následujících věcí z předchozího dotazu:
pd a wm jsou předpony oboru názvů používané v tomto dotazu. Identifikují stejné obory názvů používané v dokumentu, který se dotazuje.
XQuery určuje vnořenou smyčku FOR. Vnější smyčka FOR je vyžadována, protože chcete načíst atributy ProductModelID elementu <
ProductDescription
>. Vnitřní smyčka FOR je povinná, protože chcete jenom produkty, které mají popisy funkcí záruky, které jsou delší než 20 znaků.
Toto je částečný výsledek:
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>
...
Viz také
funkce XQuery proti datového typu XML