Conheça também: Onmasters . Ofertas . Divulgue! . Vai.la . Geraboleto . Baixa.la . Assista.la . Joga.la
» Início » Desenvolvimento » Banco de dados e SQL » SQL Server 2005 New Features: Os métodos XML - Parte 1 -->
 
Avaliação: | Publicado em: 17/07/2007
SQL Server 2005 New Features: Os métodos XML - Parte 1


Vinculando colunas e variáveis SQL

Em algumas situações, pode ser necessário a atribuição de um valor a uma expressão XQuery de forma dinâmica, ou seja, ao invés de construir a expressão XQuery de forma estática, pode ser necessário utilizar o valor de uma coluna ou de uma variável. Embora seja possível realizar essa construção utilizando o EXEC, isso a tornaria tremendamente inflexível para combinar com outras tabelas e parâmetros. Para realizar vinculações de expressões XQuery com variáveis e colunas é necessário utilizar as extensões “sql:variable” e “sql:column”. São ditas extensões, por que são funções proprietárias do SQL Server 2005 não funcionando no padrão XQuery proposto pelo W3C ou em outros SGBDs que dêem suporte a XQuery.

A extensão sql:variable

O exemplo abaixo mostra como utilizar o valor de uma variável diretamente em uma expressão XQuery através da extensão sql:variable.

DECLARE @valMin INT
SET @valMin = 1000

DECLARE @xml XML
SET @xml = '<?xml version="1.0"?>
   <Clientes>
    <Cliente Nome="Daniel" Salario="5200"/>
    <Cliente Nome="Karol" Salario="2700"/>
    <Cliente Nome="Eliane" Salario="1900"/>
   </Clientes>'

-- Seleciona os clientes com salário superior a @valMin
-- Como todos ganham acima de 1000, 3 registros foram escolhidos

SELECT @xml.query('/Clientes/Cliente[@Salario>sql:variable("@valMin")]')

-- Muda o valor da variável @valMin
SET @valMin = 5000

-- Seleciona os clientes com salário superior a @valMin
-- Como apenas Daniel ganha acima de 5000, 1 registro foi escolhido

SELECT @xml.query('/Clientes/Cliente[@Salario>sql:variable("@valMin")]')

A extensão sql:column

Da mesma forma que é possível referenciar variáveis, é possível referenciar colunas SQL dentro de uma expressão XQuery. O exemplo abaixo demonstra como isso pode ser feito:

-- Criação da tabela
CREATE TABLE #tblLancamentos (
 ClienteID INT NOT NULL,
 Limite NUMERIC(10,2) NOT NULL,
 Lancamentos XML)

-- Inserção de registros
INSERT INTO #tblLancamentos
 (ClienteID, Limite, Lancamentos)
VALUES
 (1, 5000,
 '<?xml version="1.0"?>
 <Lancamentos>
  <Lancamento Valor="1000"/>
  <Lancamento Valor="2000"/>
  <Lancamento Valor="5000"/>
  <Lancamento Valor="7000"/>
  <Lancamento Valor="9000"/>
 </Lancamentos>'
)

INSERT INTO #tblLancamentos
 (ClienteID, Limite, Lancamentos)
VALUES
 (2, 3000,
 '<?xml version="1.0"?>
 <Lancamentos>
  <Lancamento Valor="1000"/>
  <Lancamento Valor="2000"/>
  <Lancamento Valor="2500"/>
  <Lancamento Valor="3200"/>
  <Lancamento Valor="4100"/>
 </Lancamentos>'
)

-- Recuperar os lançamentos que violaram os limites por cliente
SELECT
 ClienteID, Limite,
 Lancamentos.query('<Violacao>{
  /Lancamentos/Lancamento[@Valor>=sql:column("Limite")]}
  </Violacao>'
) As Violacao
FROM
 #tblLancamentos

Este artigo é a parte 1 de 2 da seguinte série:
  1. SQL Server 2005 New Features: Os métodos XML - Parte 1
  2. SQL Server 2005 New Features: Os métodos XML - Parte 2

Prático! Objetivo! Claro! Linguagem Simples e estruturada, Excelente didática! Material muito bem planejado e blilhantemente elaborado!!!