» 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


Consultas Avançadas

A utilização desses métodos não está restrita a cláusulas SELECT e podem ser utilizados em cláusulas WHERE. A flexibilidade da XQuery também permite a utilização de JOINs entre estruturas XML. Seguem alguns exemplos mais aprofundados

SET DATEFORMAT YMD
DECLARE @xmlClientes XML
SET @xmlClientes =
 '<?xml version="1.0"?>
 <Clientes>
  <Cliente Nome="João" DataNasc="1979-01-13" UF="RS"/>
  <Cliente Nome="José" DataNasc="1983-09-25" UF="SP"/>
  <Cliente Nome="Garu" DataNasc="1976-03-14" UF="SP"/>
  <Cliente Nome="Roni" DataNasc="1977-12-07" UF="DF"/>
  <Cliente Nome="Lois" DataNasc="1978-10-15" UF="RJ"/>
  <Cliente Nome="Lana" DataNasc="1984-07-10" UF="MG"/>
  <Cliente Nome="Cloe" DataNasc="1981-03-31" UF="RN"/>
 </Clientes>'

-- Retorna todos os clientes que nasceram a partir de 1980
SELECT
 Clientes.Cliente.value(
'@Nome','nvarchar(20)')
  As Nome,
 Clientes.Cliente.value(
'@DataNasc','smalldatetime')
  As DataNasc,
 Clientes.Cliente.value(
'@UF','char(2)')
  As UF
FROM
 @xmlClientes.nodes('/Clientes/Cliente') Clientes (Cliente)
WHERE
 Clientes.Cliente.value(
'@DataNasc', 'smalldatetime') >= '1980-01-01'
 
DECLARE @xmlCarros XML
SET @xmlCarros =
 '<?xml version="1.0"?>
 <Carros>
  <Carro Nome="Palio" Placa="JAF-4752" Dono="João"/>
  <Carro Nome="Fiesta" Placa="IFT-3391" Dono="João"/>
  <Carro Nome="Corsa" Placa="GAH-7493" Dono="José"/>
  <Carro Nome="Vectra" Placa="GDY-4570" Dono="Garu"/>
  <Carro Nome="Astra" Placa="JGA-7793" Dono="Roni"/>
  <Carro Nome="Uno" Placa="JPG-1536" Dono="Roni"/>
  <Carro Nome="Ka" Placa="KOP-3541" Dono="Lois"/>
  <Carro Nome="Astra" Placa="LOI-6404" Dono="Lois"/>
  <Carro Nome="Palio" Placa="HFA-5542" Dono="Lana"/>
  <Carro Nome="Uno" Placa="GYB-4690" Dono="Lana"/>
 </Carros>'

-- Retorna todos os clientes que tem Palio
SELECT
 Carros.Carro.value(
'@Nome','nvarchar(20)')
  As Nome,
 Carros.Carro.value(
'@Placa','nchar(8)')
  As Placa,
 Carros.Carro.value(
'@Dono','nvarchar(20)')
  As Dono
FROM
 @xmlCarros.nodes('/Carros/Carro') Carros (Carro)
WHERE
 Carros.Carro.exist(
'@Nome[.="Palio"]') = 1

DECLARE @xmlTudo XML
SET @xmlTudo =
 '<?xml version="1.0"?>
 <Dados>
  <Clientes>
   <Cliente Nome="João" DataNasc="1979-01-13" UF="RS"/>
   <Cliente Nome="José" DataNasc="1983-09-25" UF="SP"/>
   <Cliente Nome="Garu" DataNasc="1976-03-14" UF="SP"/>
   <Cliente Nome="Roni" DataNasc="1977-12-07" UF="DF"/>
   <Cliente Nome="Lois" DataNasc="1978-10-15" UF="RJ"/>
   <Cliente Nome="Lana" DataNasc="1984-07-10" UF="MG"/>
   <Cliente Nome="Cloe" DataNasc="1981-03-31" UF="RN"/>
  </Clientes>
  <Carros>
   <Carro Nome="Palio" Placa="JAF-4752" Dono="João"/>
   <Carro Nome="Fiesta" Placa="IFT-3391" Dono="João"/>
   <Carro Nome="Corsa" Placa="GAH-7493" Dono="José"/>
   <Carro Nome="Vectra" Placa="GDY-4570" Dono="Garu"/>
   <Carro Nome="Astra" Placa="JGA-7793" Dono="Roni"/>
   <Carro Nome="Uno" Placa="JPG-1536" Dono="Roni"/>
   <Carro Nome="Ka" Placa="KOP-3541" Dono="Lois"/>
   <Carro Nome="Astra" Placa="LOI-6404" Dono="Lois"/>
   <Carro Nome="Palio" Placa="HFA-5542" Dono="Lana"/>
   <Carro Nome="Uno" Placa="GYB-4690" Dono="Lana"/>
  </Carros>
 </Dados>'

-- Retornar todos os clientes e seus respectivos carros
-- Isso é similar a um LEFT OUTER JOIN

SELECT @xmlTudo.query('<Clientes>{
for $cliente in /Dados/Clientes/Cliente
 return
 <Cliente Nome="
{$cliente/@Nome}">
 <Carros>
 {
  for $carro in /Dados/Carros/Carro
  where
$carro/@Dono = $cliente/@Nome
  return <Carro>{$carro/@Placa}</Carro>
 }
 </Carros></Cliente>}</Clientes>'
)

Páginas: « Anterior 1 2 3 4 5 6 7 8 9 Próximo »  Próximo: Vínculos »

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!!!