Alexandre's profileBlog do Alexandre LopesBlogListsNetwork Tools Help

Alexandre Lopes

Occupation
Location
Atua como Technology Specialist implementando soluções na plataforma SQL Server. Possui sólida experiência na área de TI sendo certificado Microsoft com os títulos MCITP, MCTS, MCDBA, MCSE e MCT.

Blog do Alexandre Lopes

July 03

XML & SQL Server: Links recomendados

 
Finalizando, segue os links recomendados para estudos mais avançados de XML:
 

Basic Syntax of the FOR XML Clause
http://msdn.microsoft.com/pt-br/library/ms190922.aspx

 
 
 
 
Managing XML Schema Collections on the Server
http://msdn.microsoft.com/pt-br/library/ms187856.aspx
 
Abraços,
Alexandre Lopes

Criando Indices XML

 

Voce pode criar índices XML usando a mesma definição do Transact SQL para criar indices relacionais e obter os beneficios de uma boa performance. A sua aplicação pode se beneficiar de indices XML nas queries que utilizam colunas do tipo XML. É preciso levar em consideração o custo de manutenção de um indice XML durante o processo de modificação de dados, por exemplo. 

 

Existem 2 tipos de indices: XML Primario e XML Secundario. O SQL Server 2008 suporta os 2 tipos de indices sendo 1 primario e o secundario ele desmembra em 3 sub-tipos: PATH, VALUE e PROPERTY.

 

Praticando...

 

USE WebcastXML2008;
GO


-- 1º passo: Criar Primary Key na tabela tbl_XML2008

ALTER TABLE dbo.tbl_XML2008 WITH NOCHECK
ADD CONSTRAINT PK_Identificador PRIMARY KEY CLUSTERED(ID)
GO


-- Agora sim, criando Indice XML Primario

SET ARITHABORT ON
CREATE PRIMARY XML INDEX XMLID ON dbo.tbl_XML2008(LogRecord)
GO

 

-- Criando Indice XML Secundario (FOR PATH)

CREATE XML INDEX XMLPATH_XMLID ON dbo.tbl_XML2008 (LogRecord)
USING XML INDEX XMLID FOR PATH WITH (FILLFACTOR = 70, PAD_INDEX =OFF)
GO

 

-- Verificando a criação dos indices associados a tabela:

 

 

 

-- Verificando a criacao dos indices XML na sys.indexes ...

SELECT * FROM sys.indexes where type_desc = 'XML'

 

Abraços,
Alexandre Lopes

Usando metodos XML


Dando continuidade aos posts sobre o tema "Usando XML no SQL Server 2008", vou escrever sobre os métodos XML. O tipo de dados XML possui 5 métodos para suportar consultas e modificações no XML. Esses métodos são extremamente fáceis de serem usados devido a sua praticidade e flexibilidade. São 5 metodos que serão apresentados abaixo:
 
- Query()
Se o seu objetivo é retornar partes ou seções de um conteudo XML, o metodo Query() é a melhor escolha. Ele executa uma query para avaliar a expressão Xquery através de elementos e atributos existentes no XML consultado.
 
- Value()
O metodo Value() é utilizado quando se deseja extrair valores de conteudo XML, mais particularmente o conteudo de uma coluna com o tipo de dados XML, variavel ou parametro. Dessa forma, você pode especificar consultas SELECT que combinam ou comparam dados de XML com dados em colunas não-XML.
 
- Exist()
Auto-explicativo, o método Exist() checa a existencia de um fragmento XML especifico no conteudo XML. Retorna um bit que representa uma das seguintes condições:
- 1: Representando Verdadeiro, se a expressão XQuery em uma consulta retornar um resultado com conteudo.
- 0: Representando Falso, se retornar um resultado vazio.
- NULL se a instância de tipo de dado xml na qual a consulta foi executada contiver NULL
 
- Nodes()
O método nodes() é útil quando você quiser fragmentar uma instância de tipo de dados xml em dados relacionais. O resultado do método nodes() é um conjunto de linhas que contém cópias lógicas do conteudo XML original.
 
Você pode recuperar vários valores do conjunto de linhas. Por exemplo, você pode aplicar o método value() ao conjunto de linhas retornado por nodes() e recuperar vários valores do XML original.
 
- Modify()
O método Modify() modifica o conteúdo de um documento XML. Utilize esse método para modificar o conteúdo de uma coluna ou variável do tipo xml. Esse método utiliza uma instrução XML DML para inserir, atualizar ou excluir nós de dados XML. O método modify() do tipo de dados xml pode ser usado apenas na cláusula SET de uma instrução UPDATE. Este método recebe um único parâmetro de entrada que obriga a validação XML DML e executa no XML.

Vamos praticar....

USE WebcastXML2008
GO


Exemplo de uso do metodo Query():

DECLARE @xmlvar xml
SET @xmlvar =
'<Motocross>
 <Team Manufacturer="Yamaha">
  <Rider Size="250">
   <RiderName>Tim Ferry</RiderName>
  </Rider>
  <Rider Size="250">
   <RiderName>Chad Reed</RiderName>
  </Rider>
 </Team>
</Motocross>'
SELECT @xmlvar.query('/Motocross/Team/Rider')
GO

Resultado....

Exemplo de uso do metodo Value(). O resultado retorna o varchar Yamaha, a expressao XQuery retorna o primeiro atributo  em  /Motocross/Team:

DECLARE @xmlvar xml
DECLARE @Team varchar(50)
SET @xmlvar =
'<Motocross>
  <Team Manufacturer="Yamaha">
    <Rider Size="250">
      <RiderName>Tim Ferry</RiderName>
    </Rider>
   <Rider Size="250">
   <RiderName>Chad Reed</RiderName>
     </Rider>
 </Team>
</Motocross>'
SET @Team = @xmlvar.value('(
/Motocross/Team/@Manufacturer)[1]', 'varchar(50)')
SELECT @Team, @xmlvar
GO

Resultado...


Exemplo de uso do metodo Exist(), procura pela existencia de um fragmento XML especifico. O resultado pode ser 1 se existir e 0 se não existir.

DECLARE @xmlvar xml
DECLARE @bitvar1 bit
DECLARE @bitvar2 bit
SET @xmlvar =
'<Motocross>
 <Team Manufacturer="Yamaha">
  <Rider Size="250">
   <RiderName>Tim Ferry</RiderName>
  </Rider>
  <Rider Size="250">
   <RiderName>Chad Reed</RiderName>
  </Rider>
 </Team>
</Motocross>'
SET @bitvar1 = @xmlvar.exist('/Motocross/Team[@Manufacturer eq xs:string("Yamaha")]')
SET @bitvar2 = @xmlvar.exist('/Motocross/Team[@Manufacturer eq xs:string("Dafra")]')

select para validar verdadeiro ou falso

SELECT @bitvar1 AS 'Existe Yamaha', @bitvar2 AS 'Não existe Dafra'




Exemplo de uso do metodo Nodes(). Nesta pesquisa, o retorno apresenta agrupamento por equipe e apresenta os seus pilotos

DECLARE @xmlvar xml
SET @xmlvar=
'<Motocross>
 <Team Manufacturer="Yamaha">
  <Rider>Tim Ferry</Rider>
  <Rider>Chad Reed</Rider>
  <Rider>David Vuillemin</Rider>
 </Team>
 <Team Manufacturer="Honda">
  <Rider>Kevin Windham</Rider>
  <Rider>Mike LaRacco</Rider>
  <Rider>Jeremy McGrath</Rider>
 </Team>
 <Team Manufacturer="Suzuki">
  <Rider>Ricky Carmichael</Rider>
  <Rider>Broc Hepler</Rider>
 </Team>
 <Team Manufacturer="Kawasaki">
  <Rider>James Stewart</Rider>
  <Rider>Michael Byrne</Rider>
 </Team>
</Motocross>'
SELECT Motocross.Team.query('.') AS RESULT
FROM @xmlvar.nodes('/Motocross/Team') Motocross(Team)


Exemplo de uso do metodo Modify(), uma inclusao é realizada na variavel com tipo de dados XML

DECLARE @xmldoc xml
SET @xmldoc =
'<Root>
 <Employee EmployeeID="1">
  <EmployeeInformation>
  </EmployeeInformation>
 </Employee>
</Root>'
SELECT @xmldoc

Efetuando a inclusao propriamente dita

SET @xmldoc.modify('insert <LastName>Knievel</LastName> into (/Root/Employee/EmployeeInformation)[1]')
SELECT @xmldoc
GO

Com a inclusão realizada...


Os exemplos a seguir utilizam o metodo Modify() e alteram registros na tabela tbl_XML2008

Exemplo de uso do metodo Modify() com insert

UPDATE tbl_XML2008
SET LogRecord.modify('
 insert <information flag="custom"><message>SQL Server service is starting</message></information>
 into logRecord[1]')
WHERE ApplicationName = 'SalesApp'

testando...

select * from tbl_XML2008




Exemplo de uso do metodo Modify() com "replace value of"

UPDATE tbl_XML2008
SET LogRecord.modify('
 replace value of (logRecord/information/message)[1]
 with "Not enough memory"')
WHERE ApplicationName = 'HoursReport'

testando...

select * from tbl_XML2008




Exemplo de uso do metodo Modify() com delete

UPDATE tbl_XML2008
SET LogRecord.modify('
 delete logRecord/post')
WHERE ApplicationName = 'CustomerService'

testando...

select * from tbl_XML2008



Abraços,
Alexandre Lopes

June 26

Numero de profissionais certificados em SQL Server

 
Segue a lista com o total de profissionais certificados em SQL Server em todo o planeta terra:
 
Microsoft Certified Database Administrator (MCDBA):
153.130 - MCDBA: SQL Server 2000

Microsoft Certified Technology Specialist:
51.445 - MCTS: SQL Server 2005
3.577 - MCTS: SQL Server 2005 Business Intelligence
854 - MCTS: SQL Server 2008 Implementation and Maintenance
333 - MCTS: SQL Server 2008 Business Intelligence Development and Maintenance
456 - MCTS: SQL Server 2008 Database Development

Microsoft Certified IT Professional (MCITP):
7.928 - MCITP: SQL Server 2005 Database Administrator
3.377 - MCITP: SQL Server 2005 Database Developer
1.385 - MCITP: SQL Server 2005 Business Intelligence Developer
358 - MCITP: SQL Server 2008 Database Administrator
213 - MCITP: SQL Server 2008 Database Developer
137 - MCITP: SQL Server 2008 Business Intelligence Developer

Microsoft Certified Architect (MCA):
18 - MCA: Database

Microsoft Certified Master (MCM):
39 - MCM: SQL Server 2005
2 - MCM: SQL Server 2008
 
 
Abraços,
Alexandre Lopes
June 25

XQUERY E XPATH

 

O W3C desenvolveu duas linguagens de consultas que fornecem uma poderosa capacidade para manipular estruturas XML. São elas XQUERY e XPATH.

XQUERY é uma linguagem de consulta criada exclusivamente para dados XML. A Transact-SQL oferece suporte a um subconjunto desta linguagem usado para consultar o tipo de dados xml. Esta linguagem está em constante desenvolvimento pelo W3C, com a participação de todos os principais fornecedores de banco de dados. A XQuery é baseada na linguagem XPath existente, com suporte adicional para uma melhor iteração, melhores resultados de classificação e com a capacidade de construir o XML necessário.

A linguagem XQUERY não oferece palavras-chave para manipulação de dados, mas a Microsoft extendeu as capacidades da XQUERY no SQL SERVER incluindo um conjunto de instruções para que o desenvolvedor possa adicionar, atualizar e apagar dados XML (XML DML = Data Manipulation Language).

O exemplo abaixo realiza as seguintes tarefas: Obtem registros usando o metodo query() e XQuery. Retorna uma estrutura XML representando um relatorio com todas as mensagens de erro existentes no conteudo XML

DECLARE @Date nvarchar(50)
DECLARE @UID nvarchar(256)
SET @UID = USER_NAME();
SET @Date = GETDATE();

SELECT TOP(1) LogRecord.query('<errorReport issuedby="{sql:variable("@UID")}" date="{sql:variable("@Date")}"/>'),
 (
  SELECT LogRecord.query('
   for $rec in /logRecord, $err in $rec/error
   order by $rec/@timestamp descending
   return
     <error number="{data($err/@number)}" timestamp="{data($rec/@timestamp)}" server="{data($rec/@machine)}">
    <message>{data($err/message)}</message>
    <module>{data($err/module)}</module>
     </error>')
  FROM tbl_XML2008
  WHERE LogRecord.exist('/logRecord/error') = 1
  FOR XML PATH(''),TYPE
 )
FROM tbl_XML2008
FOR XML PATH(''), ROOT('tbl_XML2008'), TYPE

O exemplo abaixo realiza as seguintes tarefas: Obtem valores independentes usando o metodo value() e XPath. E retorna uma estrutura tabular representando um relatorio com todas as mensagens de erro existentes no conteudo XML:

SELECT LogRecord.value('(/logRecord/error/@number)[1]','int') AS [ErrorNumber],
  LogRecord.value('(/logRecord/@timestamp)[1]','nvarchar(20)') AS [TimeStamp],
  LogRecord.value('(/logRecord/@machine)[1]','nvarchar(10)') AS [ServerName],
  LogRecord.value('(/logRecord/error/message)[1]','nvarchar(100)') AS [Message],
  LogRecord.value('(/logRecord/error/module)[1]','nvarchar(20)') AS [Module]
FROM tbl_XML2008
WHERE LogRecord.exist('/logRecord/error') = 1

 

Abraços,
Alexandre Lopes