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

Aplica-se a:SQL Server

Conforme descrito no tópico Associando 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 de 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 XQuery correspondente e seu tipo será um tipo base XQuery equivalente ao tipo 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.

Em 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.

Não há suporte para a função sql:column() em operações JOIN. Em vez disso, pode ser usada a operação APPLY.

Exemplos

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

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

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 de atributo ProductID, ProductName e ProductPrice são obtidos da 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 Prólogo XQuery 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 dentro de 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. Em seguida, o XML é 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  

Consulte Também

Funções de extensão XQuery do SQL Server
Comparar XML tipado com XML não tipado
Dados XML (SQL Server)
Criar instâncias de dados XML
Métodos de Tipos de Dados XML
Linguagem de modificação de dados XML (XML DML)