Função concat (XQuery)
Aceita zero ou mais cadeias de caracteres como argumentos e retorna uma cadeia de caracteres criada concatenando os valores de cada um desses argumentos.
Sintaxe
fn:concat ($string as xs:string?
,$string as xs:string?
[, ...]) as xs:string
Argumentos
- $string
Cadeia de caracteres opcional para concatenar.
Comentários
A função requer pelo menos dois argumentos. Se um argumento for uma sequência vazia, será tratado como a cadeia de caracteres de comprimento zero.
Exemplos
Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas do tipo xml no banco de dados de exemplo AdventureWorks2008R2. Para obter uma visão geral de cada uma dessas colunas, consulte Representação de tipo de dados xml no banco de dados do AdventureWorks2008R2.
A. Uso da função concat() XQuery para concatenar cadeias de caracteres
Para um modelo de produto específico, essa consulta retorna uma cadeia de caracteres criada concatenando o período de garantia e a descrição de garantia. No documento de descrição do catálogo, o elemento <Warranty> é composto pelos elementos filho <WarrantyPeriod> e <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;
Observe o seguinte na consulta anterior:
Na cláusula SELECT, CatalogDescription é uma coluna do tipo xml. Portanto, é utilizado o método query() (tipo de dados XML), Instructions.query (). A instrução XQuery é especificada como o argumento para o método de consulta.
O documento contra o qual a consulta é executada usa namespaces. Assim, a palavra-chave namespace é usada para definir o prefixo para o namespace. Para obter mais informações, consulte Prólogo XQuery.
Este é o resultado:
<Product ProductModelID="28" ProductModelName="Road-450">1 year-parts and labor</Product>
A consulta anterior recupera informações de um produto específico. A consulta a seguir recupera as mesmas informações de todos os produtos para os quais são armazenadas descrições do catálogo XML. O método exist() do tipo de dados xml na cláusula WHERE retornará True se o documento XML nas linhas tiver um elemento <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
Observe que o valor Booleano retornado pelo método exist() do tipo xml é comparado com 1.
Limitações de implementação
Estas são as limitações:
- A função concat() no SQL Server aceita somente valores do tipo xs:string. Outros valores precisam ser explicitamente convertidos em xs:string ou xdt:untypedAtomic.