Share via


Função sql:variable() (XQuery)

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

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

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

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

Você só pode se referir a uma instância 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 valores que são do tipo xml ou tipo CLR (common language runtime) definido pelo usuário.

Exemplos

A. Usando uma função sql:variable() para levar um valor da 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 palavra-chave namespace é usada para definir um prefixo de namespace no Prólogo do 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" />