Gerando retorno XML com Visual Studio 2010

Pessoal,

Alguns leitores me enviaram e-mails solicitando ajuda para colocar o código do post Gerando arquivos XML com SQL Server em um aplicativo .NET e como sempre eu faço o possível para ajudar, abaixo esta o código em VB.NET.

Para criar esse código eu utilizei o Visual Studio 2010 e criei um Console Application. Para quem quiser fazer o download da versão beta é só clicar aqui, porém esse código irá rodar sem problemas no Visual Studio 2008.

Imports System.Data.SqlClient
Imports System.Xml
Module Module1

  Sub Main()
   
Dim lSQL As String = “select * from HumanResources.Department for xml auto”
   
Dim lConexao As String = “Data Source =(local); integrated security=SSPI; Initial Catalog=Adventureworks;”
   
Dim lCon As New SqlClient.SqlConnection(lConexao)
   
Dim lCmd As New SqlCommand(lSQL, lCon)
    lCon.Open()
   
Dim lrXml As XmlReader = lCmd.ExecuteXmlReader()
   
Console.WriteLine(“<?xml version=1.0 encoding=ISO-8859-1?>”)
   
Console.WriteLine(“<Departament>”)
   
While (lrXml.Read())
     
Console.WriteLine(lrXml.ReadOuterXml())
   
End While
   
Console.WriteLine(“</Departament>”)
    lrXml.Close()
 
End Sub

End Module

 

Pessoal, não preciso nem concluir não é? Muito fácil, mas se houver alguma dúvida é só pedir.

Abraço, Rodrigo

Download disponível – Webcast 30 scripts que não podem faltar no pendrive de um DBA! Parte 2

Pessoal,

Ontem (20/02/2010) aconteceu o tão esperado webcast dos 30 scripts que não podem faltar no pendrive de um DBA! Parte 2. Esse webcast foi apresentado por mim, Alexandre Lopes e Vitor Fava. E já estão disponíveis para download a apresentação e os scripts.

Então não esqueçam de rechear os seus pendrives com esses novos scripts.

Abraço, Rodrigo

Gerando arquivos XML com SQL Server

A partir do SQL Server 2000 é possível extrair de um banco de dados, de maneira direta, dados no formato XML.  Esta funcionalidade é de grande ajuda quando falamos de integrações com diversos sistemas, ou extrações de dados para relatórios, dispositivos móveis, arquivos portáveis e etc.

Para gerar um arquivo XML utilizamos a instrução FOR XML, que pode vir acompanhada das opções: RAW, AUTO e EXPLICIT.

Por exemplo, a instrução abaixo:

SELECT cdcliente, nmcliente

      FROM dbo.cliente FOR XML raw

Essa instrução nos retornará o seguinte XML:

<row cdcliente=“1” nmcliente=“SQL Server Day”/>

<row cdcliente=“2” nmcliente=“DotNetDay”/>

<row cdcliente=“3” nmcliente=“SQL Saturday Night”/>

<row cdcliente=“4” nmcliente=“Cliente A”/>

<row cdcliente=“5” nmcliente=“Cliente B”/>

<row cdcliente=“6” nmcliente=“Cliente C”/>

<row cdcliente=“7” nmcliente=“Cliente D”/>

A instrução FOR XML com a opção RAW cria o elemento ROW e cada campo é transformado em atributo desse elemento.

A instrução FOR XML com a opção AUTO utiliza o nome da tabela como delimitador de elementos, essa opção pode vir acompanhada do argumento opcional ELEMENT acompanhe o código a seguir:

SELECT cdcliente, nmcliente

      FROM dbo.cliente FOR XML AUTO, ELEMENTS

Este código irá gerar o retorno abaixo:

<dbo.cliente>
    <cdcliente>1</cdcliente>
    <nmcliente>SQL Server Day</nmcliente>
</dbo.cliente>
<dbo.cliente>
    <cdcliente>2</cdcliente>
    <nmcliente>DotNetDay</nmcliente>
</dbo.cliente>
    <dbo.cliente><cdcliente>3</cdcliente>
    <nmcliente>SQL Saturday Night</nmcliente>
</dbo.cliente>
<dbo.cliente>
    <cdcliente>4</cdcliente>
    <nmcliente>Cliente A</nmcliente>
</dbo.cliente>
<dbo.cliente>
    <cdcliente>5</cdcliente>
    <nmcliente>Cliente B</nmcliente>
</dbo.cliente>
<dbo.cliente>
    <cdcliente>6</cdcliente>
    <nmcliente>Cliente C</nmcliente>
</dbo.cliente>
<dbo.cliente>
    <cdcliente>7</cdcliente>
    <nmcliente>Cliente D</nmcliente>
</dbo.cliente>

É importante lembrar que o arquivo XML deve ser composto de u elemento Raíz, veja o retorno à cima com o elemento Raíz:

<Cliente>    
    <dbo.cliente>
        <cdcliente>1</cdcliente>
        <nmcliente>SQL Server Day</nmcliente>
    </dbo.cliente>
    <dbo.cliente>
        <cdcliente>2</cdcliente>
        <nmcliente>DotNetDay</nmcliente>
    </dbo.cliente>
        <dbo.cliente><cdcliente>3</cdcliente>
        <nmcliente>SQL Saturday Night</nmcliente>
    </dbo.cliente>
    <dbo.cliente>
        <cdcliente>4</cdcliente>
        <nmcliente>Cliente A</nmcliente>
    </dbo.cliente>
    <dbo.cliente>
        <cdcliente>5</cdcliente>
        <nmcliente>Cliente B</nmcliente>
    </dbo.cliente>
    <dbo.cliente>
        <cdcliente>6</cdcliente>
        <nmcliente>Cliente C</nmcliente>
    </dbo.cliente>
    <dbo.cliente>
        <cdcliente>7</cdcliente>
        <nmcliente>Cliente D</nmcliente>
    </dbo.cliente>
</Cliente>

É muito simples fazer extração para XML desta forma. Aguardo comentários, dúvidas ou sugestões.

Abraços, Rodrigo

Paper-clip

No final de 2009 eu comecei a editar esse blog com o BlogEngine.Net e como é comum depois do BlogEngine.Net instalado comecei a procurar um tema para ele, até desenvolvi um, mas como o paper-clip não há igual.

Foi ai que eu encontrei no blog do Caio Proiete o tema adaptado por ele pronto para uso, conversei com o Caio e lógico o tema é free, porém estão os créditos no rodapé do blog.

Para fazer o download dos temas veja o post do Caio Proiete no link: http://www.caioproiete.com/blogs/pontonet/post/2008/02/Tema-Paperclip-para-BlogEngineNET.aspx

 

Abraço, Rodrigo

30 Scripts que não podem faltar no pendrive de um DBA! Parte 2

Pessoal, acontecerá o segundo webcast com os 30 scripts que não podem faltar no seu pendrive!

Serão apresentados scripts para segurança, performance, manipulação de databases e tabelas, etc… Os scripts foram desenvolvidos em Transact-SQL e Powershell.

Os palestrantes serão: Rodrigo Crespi (Eu), Vitor Fava e Alexandre Lopes.

Não deixe participar, o evento acontecerá dia 20/02/2010 as 17:45.

Para fazer a inscrição acesse o link abaixo:

http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032442523&EventCategory=4&culture=en-US&CountryCode=US

Abraço, Rodrigo

Utilizando o Rank() e o Dense_Rank()

A função Rank permite que façamos a avaliação de ranking sobre um resultado de uma query.

Por exemplo, criei uma estrutura em uma tabela que possui os campos: cdcliente, nmcliente e nrnota onde nrnota é um valor atribuído ao cliente que vai de 1 à 10, esse valor é atribuído através do ERP que classifica baseado em diversas métricas.

Se eu quiser consultar os meus clientes montando um rank do cliente com melhor pontuação para o cliente com a pontuação mais baixa eu posso utilizar uma query com order by veja o exemplo:

SELECT nmcliente, nrnota FROM cliente ORDER BY nrnota desc

É fácil perceber que os três primeiros registros estão entre os clientes com melhor pontuação, porém, se quisermos que esse resultado possua uma coluna indicando qual a posição do meu cliente no ranking, igual ao ranking de vencedores de uma competição de natação onde eu tenho o primeiro lugar, segundo e terceiro.

SELECT nmcliente, nrnota, RANK() OVER(order BY nrnota desc) FROM Cliente ORDER BY nrnota desc 

Analise o resultado abaixo.

 

Na terceira coluna, utilizando a função rank eu criei a exibição do ranking dos meus clientes ordenados pelo cliente de maior pontuação para o cliente de menor.

Na próxima query eu vou retornar o top 3 dos meus clientes.

WITH RankCliente AS (
SELECT nmcliente, nrnota, RANK() OVER(order BY nrnota desc) AS ranking FROM Cliente)
SELECT * FROM RankCliente WHERE ranking <= 3 

Agora para dificultar um leitor do meu blog me enviou uma pergunta, como fazer ranking, porém o retorno ser em seqüência? A resposta é com o Dense_Rank veja o exemplo.

WITH RankCliente AS (
SELECT nmcliente, nrnota, 
    DENSE_RANK() OVER(order BY nrnota desc) AS ranking FROM Cliente)
SELECT * FROM RankCliente WHERE ranking <= 3

É fácil notar que o resultado da query a cima tem o mesmo filtro da enterior é o meu Top 3 de clientes, entretanto o retorno são 4 registros indicando os meus 4 clientes com melhor avaliação.

Pessoal era isso que eu tinha para falar sobre o Rank e o Dense_Rank, se ficaram algumas ou sugestões deixem seus comentários, ou enviem e-mails.

Abraço, Rodrigo.