Compartir a través de


concat (función de XQuery)

Acepta cero o más cadenas como argumentos y devuelve una cadena creada mediante la concatenación de los valores de cada uno de estos argumentos.

Sintaxis

fn:concat ($string as xs:string?
           ,$string as xs:string?
           [, ...]) as xs:string

Argumentos

  • $string
    Cadena opcional que se concatenará.

Comentarios

La función requiere al menos dos argumentos. Si un argumento es una secuencia vacía, se tratará como una cadena de longitud cero.

Ejemplos

En este tema se ofrecen ejemplos de XQuery con instancias XML almacenadas en varias columnas de tipo xml en la base de datos de ejemplo AdventureWorks2008R2. Para obtener información general de estas columnas, vea Representación de tipo de datos xml en la base de datos AdventureWorks2008R2.

A. Usar la función de XQuery concat() para concatenar cadenas

Para un modelo de producto determinado, esta consulta devuelve una cadena creada mediante la concatenación del período de garantía y la descripción de la misma. En el documento de descripción del catálogo, el elemento <Warranty> está formado por los elementos secundarios <WarrantyPeriod> y <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 lo siguiente en la consulta anterior:

  • En la cláusula SELECT, CatalogDescription es una columna de tipo xml. Por tanto, se utiliza query() (método de tipo de datos xml), Instructions.query(). La instrucción de XQuery se especifica como el argumento para el método de consulta.

  • El documento en el que se ejecuta la consulta utiliza espacios de nombres. Por tanto, la palabra clave namespace se utiliza para definir el prefijo para el espacio de nombres. Para obtener más información, vea Prólogo de las consultas XQuery.

El resultado es el siguiente:

<Product ProductModelID="28" ProductModelName="Road-450">1 year-parts and labor</Product>

La consulta anterior recupera información para un producto determinado. La consulta siguiente recupera la misma información para todos los productos para los que se almacenan descripciones del catálogo XML. El método exist() del tipo de datos xml de la cláusula WHERE devuelve True si el documento XML de las filas tiene un 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

Tenga en cuenta que el valor booleano devuelto por el método exist() del tipo xml se compara con 1.

Limitaciones de la implementación

Éstas son las limitaciones:

  • La función concat() en SQL Server sólo acepta los valores del tipo xs:string. Los demás valores se deben convertir explícitamente a xs:string o xdt:untypedAtomic.