Partilhar via


Funções de extensão XQuery - sql:column()

Aplica-se a:SQL Server

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

Por exemplo, o método query() (tipo de dados XML) é usado para especificar uma consulta em relação a uma instância XML armazenada em uma variável ou coluna de tipo de xml. Às vezes, você também pode querer que sua consulta use valores de outra coluna não XML para reunir 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 no função de sql:column() dentro de um XQuery refere-se a uma coluna na linha que está sendo processada.

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

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

Exemplos

Um. Usando sql:column() para recuperar o valor relacional dentro do XML

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

A consulta constrói XML que tem o seguinte formato:

<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 ProductID, ProductNamee ProductPrice valores de atributo 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 de tipo xml. Como as informações do catálogo do modelo de produto XML não são armazenadas para todos os modelos de produto, a instrução if é 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 da consulta anterior:

  • Como os valores são recuperados de 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 produtos têm descrições de catálogo.

  • O namespace palavra-chave no XQuery Prolog define o prefixo do 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 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 contém informações específicas do produto. Essas informações incluem o ProductID, ProductName, ProductPrice e, se disponível, o ProductModelName para todos os produtos que pertencem a um modelo de produto específico, ProductModelID=19. O XML é então atribuído à variável @x de tipo de 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  

Ver também

Comparar XML digitado com XML não tipado
dados XML (SQL Server)
Criar instâncias de dados XML
métodos de tipo de dados xml
XML DML (XML Data Modification Language)