Funkcje w wartościach ciągów — concat
Dotyczy:programu SQL Server
Akceptuje zero lub więcej ciągów jako argumentów i zwraca ciąg utworzony przez łączenie wartości każdego z tych argumentów.
Składnia
fn:concat ($string as xs:string?
,$string as xs:string?
[, ...]) as xs:string
Argumenty
$string
Opcjonalny ciąg do łączenia.
Uwagi
Funkcja wymaga co najmniej dwóch argumentów. Jeśli argument jest pustą sekwencją, jest traktowany jako ciąg o zerowej długości.
Znaki dodatkowe (pary zastępcze)
Zachowanie par zastępczych w funkcjach XQuery zależy od poziomu zgodności bazy danych i, w niektórych przypadkach, domyślnego identyfikatora URI przestrzeni nazw dla funkcji. Aby uzyskać więcej informacji, zobacz sekcję "XQuery Functions Are Surrogate-Aware" w temacie breaking changes to Database Engine Features in SQL Server 2016. Zobacz również ALTER DATABASE Compatibility Level (Transact-SQL) i collation and Unicode Support.
Przykłady
Ten temat zawiera przykłady zapytania XQuery dla wystąpień XML przechowywanych w różnych kolumnach xml typ w przykładowej bazie danych AdventureWorks.
A. Łączenie ciągów przy użyciu funkcji concat() XQuery
W przypadku określonego modelu produktu to zapytanie zwraca ciąg utworzony przez połączenie okresu gwarancji i opisu gwarancji. W dokumencie opisu wykazu element <Warranty
> składa się z elementów podrzędnych <WarrantyPeriod
> i <Description
>.
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('
<Product
ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }"
ProductModelName = "{ sql:column("PD.Name") }" >
{
concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1]))
}
</Product>
') as Result
FROM Production.ProductModel PD
WHERE PD.ProductModelID=28
Zwróć uwagę na następujące elementy z poprzedniego zapytania:
W klauzuli SELECT klasa CatalogDescription jest kolumną typu xml xml. W związku z tym jest używana metoda query() (typ danych XML), Instructions.query(). Instrukcja XQuery jest określana jako argument metody query.
Dokument, na którym jest wykonywane zapytanie, używa przestrzeni nazw. W związku z tym przestrzeni nazw słowo kluczowe służy do definiowania prefiksu przestrzeni nazw. Aby uzyskać więcej informacji, zobacz XQuery Prolog.
Jest to wynik:
<Product ProductModelID="28" ProductModelName="Road-450">1 year-parts and labor</Product>
Poprzednie zapytanie pobiera informacje dotyczące określonego produktu. Poniższe zapytanie pobiera te same informacje dla wszystkich produktów, dla których są przechowywane opisy wykazu XML. Metoda exist() typu danych xml xml w klauzuli WHERE zwraca wartość True, jeśli dokument XML w wierszach ma element <ProductDescription
>.
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('
<Product
ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }"
ProductName = "{ sql:column("PD.Name") }" >
{
concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1]))
}
</Product>
') as Result
FROM Production.ProductModel PD
WHERE CatalogDescription.exist('//pd:ProductDescription ') = 1
Należy pamiętać, że wartość logiczna zwracana przez metodę exist() typu xml jest porównywana z 1.
Ograniczenia implementacji
Są to ograniczenia:
- Funkcja concat() w programie SQL Server akceptuje tylko wartości typu xs:string. Inne wartości muszą być jawnie rzutowane na xs:string lub xdt:untypedAtomic.