Compartilhar via


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

Aplica-se a:SQL Server

Expõe uma variável que contém um valor relacional SQL dentro de uma expressão XQuery.

Sintaxe

  
sql:variable("variableName") as xdt:anyAtomicType?  

Comentários

Conforme descrito no tópico Associando dados relacionais dentro de XML, você pode usar essa função ao usar métodos de tipo de dados XML para expor um valor relacional dentro de XQuery.

Por exemplo, o método query() é usado para especificar uma consulta em uma instância XML armazenada em uma variável ou coluna de tipo de dados xml . Às vezes, talvez você também queira que sua consulta use valores de uma variável Transact-SQL, ou parâmetro, para reunir dados relacionais e XML. Para fazer isso, use a função sql:variable .

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

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 valores do tipo xml ou um tipo clr (Common Language Runtime) definido pelo usuário.

Exemplos

a. Usando uma função sql:variable() para levar um valor de variável Transact-SQL para o XML

O exemplo a seguir constrói uma instância XML composta do seguinte:

  • Um valor (ProductID) de uma coluna não XML. A função sql:column() é usada para associar esse valor no XML.

  • Um valor (ListPrice) de uma coluna não XML em outra tabela. Novamente, sql:column() é usado para associar esse valor no XML.

  • Um valor (DiscountPrice) de uma variável Transact-SQL. O método sql:variable() é usado para associar esse valor ao XML.

  • Um valor (ProductModelName) de uma coluna de tipo xml , para tornar a consulta mais interessante.

Esta é a consulta:

DECLARE @price money  
  
SET @price=2500.00  
SELECT ProductID, Production.ProductModel.ProductModelID,CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  
       <Product   
           ProductID="{ sql:column("Production.Product.ProductID") }"  
           ProductModelID= "{ sql:column("Production.Product.ProductModelID") }"  
           ProductModelName="{/pd:ProductDescription[1]/@ProductModelName }"  
           ListPrice="{ sql:column("Production.Product.ListPrice") }"  
           DiscountPrice="{ sql:variable("@price") }"  
        />')   
FROM Production.Product   
JOIN Production.ProductModel  
ON Production.Product.ProductModelID = Production.ProductModel.ProductModelID  
WHERE ProductID=771  

Observe o seguinte na consulta anterior:

  • O XQuery dentro do método query() constrói o XML.

  • A namespace palavra-chave é usada para definir um prefixo de namespace no Prólogo XQuery. Isso é feito porque o valor do atributo ProductModelName é recuperado na coluna de tipo CatalogDescription xml, que tem um esquema associado a ela.

Este é o resultado:

<Product ProductID="771" ProductModelID="19"   
         ProductModelName="Mountain 100"   
         ListPrice="3399.99" DiscountPrice="2500" />  

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)