Funções de Extensão XQuery – sql:column()

Aplica-se:SQL Server

Conforme descrito no tópico Vinculando dados relacionais dentro de XML, você pode usar a função sql:column(() ao usar métodos de tipo de dados XML para expor um valor relacional dentro de XQuery.

Por exemplo, o método query() (tipo de dados XML) é usado para especificar uma consulta em uma instância XML armazenada em uma variável ou coluna do tipo xml . Às vezes, você também pode desejar que sua consulta use valores de outra coluna que não seja XML, para agrupar dados relacionais e XML. Para fazer isso, use a função sql:column().

O valor SQL será mapeado para um valor correspondente XQuery e seu tipo será um tipo base XQuery equivalente ao tipo de SQL correspondente.

Sintaxe

  
sql:column("columnName")  

Comentários

Observe que a referência a uma coluna especificada na função sql:column() dentro de um XQuery refere-se a uma coluna na linha que está sendo processada.

No SQL Server, você só pode se referir a uma instância xml no contexto da expressão de origem de uma instrução de inserção XML-DML; caso contrário, você não pode se referir a colunas do tipo xml ou de um tipo CLR definido pelo usuário.

A função sql:column() não é suportada em operações JOIN. Em vez disso, pode ser usada a operação APPLY.

Exemplos

R. Usando sql:column() para recuperar o valor relacional no XML

Na construção de XML, o exemplo a seguir ilustra como você pode recuperar valores de uma coluna relacional não XML para associar dados relacionais e XML.

A consulta constrói XML que tenha a seguinte forma:

<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"   
  ProductModelName="Mountain 100" />  

Observe o seguinte no XML construído:

  • Os valores dos atributos ProductID, ProductName e ProductPrice são obtidos na tabela Product.

  • O valor do atributo ProductModelID é recuperado da tabela ProductModel .

  • Para tornar a consulta mais interessante, o valor do atributo ProductModelName é obtido da coluna CatalogDescription do tipo xml. Como as informações do catálogo de modelo do produto XML não são armazenadas para todos os modelos de produtos, a instrução if será usada para recuperar o valor somente se ele existir.

    SELECT P.ProductID, CatalogDescription.query('  
    declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           <Product   
               ProductID=       "{ sql:column("P.ProductID") }"  
               ProductName=     "{ sql:column("P.Name") }"  
               ProductPrice=    "{ sql:column("P.ListPrice") }"  
               ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
               { if (not(empty(/pd:ProductDescription))) then  
                 attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
                else   
                   ()  
    }  
            </Product>  
    ') as Result  
    FROM Production.ProductModel PM, Production.Product P  
    WHERE PM.ProductModelID = P.ProductModelID  
    AND   CatalogDescription is not NULL  
    ORDER By PM.ProductModelID  
    

Observe o seguinte na consulta anterior:

  • Como os valores são recuperados em duas tabelas diferentes, a cláusula FROM especifica duas tabelas. A condição na cláusula WHERE filtra o resultado e recupera apenas produtos cujos modelos de produto tenham descrições de catálogo.

  • A palavra-chave namespace no XQuery Prolog define o prefixo de namespace XML, "pd", que é usado no corpo da consulta. Observe que os aliases de tabela, "P" e "PM", são definidos na cláusula FROM da própria consulta.

  • A função sql:column() é usada para trazer valores não XML para dentro do XML.

Este é o resultado parcial:

ProductID               Result  
-----------------------------------------------------------------  
771         <Product ProductID="771"                   ProductName="Mountain-100 Silver, 38"   
                  ProductPrice="3399.99" ProductModelID="19"   
                  ProductModelName="Mountain 100" />  
...  

A consulta a seguir constrói XML que contenha informações específicas do produto. Tais informações incluem ProductID, ProductName, ProductPrice e, se disponível, ProductModelName de todos os produtos que pertencem a um modelo de produto específico, ProductModelID=19. O XML é então atribuído à @x variável do tipo xml .

declare @x xml  
SELECT @x = CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <Product   
           ProductID=       "{ sql:column("P.ProductID") }"  
           ProductName=     "{ sql:column("P.Name") }"  
           ProductPrice=    "{ sql:column("P.ListPrice") }"  
           ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
           { if (not(empty(/pd:ProductDescription))) then  
             attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
            else   
               ()  
}  
        </Product>  
')   
FROM Production.ProductModel PM, Production.Product P  
WHERE PM.ProductModelID = P.ProductModelID  
And P.ProductModelID = 19  
select @x