MCDBA Brasil


  • Home
  • Sobre
  • Contato

Livros





Links Rápidos

SQL Server Builds (All Versions/Editions)


Download SQL Server 2017 (trial)


SQL Server 2017 Feature Pack


SQL Server 2016 Feature Pack


Cumulative Update SQL Server 2017 builds


Cumulative Update SQL Server 2016 builds


Cumulative Update SQL Server 2014 builds


Cumulative Update SQL Server 2012 builds


SQL Server 2005/2008 Samples Databases


Documentando o Servidor SQL Server


Analisando a Performance do Servidor-CheckList


Virtual PASS PT


Faça parte do maior virtual chapter do PASS com conteúdos técnicos em Português sobre SQL Server.

Todos os meses um evento Online para você! Acompanhe aqui os WebCasts já agendados

Sindicalize seu blog ou site ao VirtualPASSPT

SQL Server Blogs

SQL Server Query Processing Team


SQL Programmability & API Development Team


SQL Server Manageability Team


Latin America Support Team


Database + Disk + Performance


Microsoft SQL Server Support


SQL CLR Team


SQL Query Optimization Team


SQL 2005 Code Samples


SQL Server Express Team


SQL SMO Samples


SQL Storage Engine Team


SQL CAT Team


SQL Protocols Team


PSS SQL Server Engineers


Slava Oks on SQLOS


Ken Henderson’s blog


LUTI@Microsoft Blog


kimberly L. Trip’s blog


Fernando Garcia Blog

Dica da Semana

Exportando dados com a xp_execresultset

por Nilton Pinheiro agosto 29, 2005 Nenhum comentário

O cenário:

Para entender melhor como esta extended stored procedure funciona, vamos ao seguinte cenário.


Você trabalha em uma empresa que possui várias filiais. Todos os pedidos de compras dos clientes de sua empresa são centralizados em uma tabela na base da sua filial. Sendo assim, uma vez por mês você é solicitado a exportar para um arquivo texto os pedidos de cada filial e posteriormente enviar os arquivos às filias correspondentes.


Para simplificar nosso exemplo, estarei utilizando a tabela ORDER da base Northwind como sendo nossa tabela central. O campo Employeeid representará nossa chave para cada uma das filiais.


Para atender a esta solicitação, uma das alternativas a ser usada poderia ser a apresentada abaixo.


Definir um cursor para cada uma das filiais, navegar através de cada filial e fazer um BCP OUT dos pedidos desta filial.


O script poderia ser algo como isto:


DECLARE cc CURSOR FAST_FORWARD
FOR SELECT DISTINCT Employeeid FROM Northwind..Orders


DECLARE @employeeid INT,
@sql VARCHAR(255)


OPEN cc
FETCH NEXT FROM cc INTO @employeeid
WHILE @@FETCH_STATUS=0
BEGIN
SET @sql = ‘BCP “SELECT * FROM Northwind..Orders WHERE Employeeid=’ + cast(@employeeid as varchar) + ‘” queryout “C:Temppedidos_filial’ + cast(@employeeid as varchar) + ‘.txt” -w -t”|” -T -S”‘ + @@servername +'”‘
–print (@sql)
EXEC master..xp_cmdshell @sql, no_output
FETCH NEXT FROM cc INTO @employeeid
END


CLOSE cc
DEALLOCATE cc


Como você pode ver o cursor é bem simples e resolve nosso problema, mas como você já deve saber, a utilização de cursores em códigos SQL não é uma prática recomenda e por outra lado, suponhamos que sua tabela possui milhões de registros e esta rotina está impactando a performance do seu sistema. Você gostaria de remover a utilização do cursor !


Poucas pessoas sabem mas tando o SQL Server 7 quanto o SQL Server 2000 fornecem uma extended stored procedure não documentada chamada xp_execresultset, que como o próprio nome diz, executa um resultset passado para ela. A xp_execresultset possui dois parâmetro Unicode, o primeiro é o statement (instrução SQL) a ser executado e o segundo é o nome da base onde o statement deverá ser executado.


Exemplo:


Use Northwind
go
— Cria uma tabela temporária para armazenar os statements do BCP
SELECT DISTINCT ‘EXEC master..xp_cmdshell ”BCP “SELECT * FROM Northwind..Orders WHERE Employeeid=’ + cast(employeeid as varchar) + ‘” queryout “C:Temppedidos_filial’ + cast(employeeid as varchar) + ‘.txt” -w -t”|” -T -S”‘ + @@servername +'””’ AS sql INTO ##TMP FROM Orders


— Executa os statements existentes na tabela temporária
EXEC master..xp_execresultset N’SELECT sql FROM ##TMP’, N’Northwind’


— Excluir a tabela temporária
DROP TABLE ##TMP
go
 
Agora que sabemos como usar a xp_execresultset. Como nós podemos usá-la para resolver nosso problema de performance com o cursor acima e se possível em um único statement ? A solução pode ser vista no script abaixo.


EXEC master..xp_execresultset N’SELECT
”EXEC master..xp_cmdshell ””BCP “SELECT * FROM Northwind..Orders WHERE Employeeid=”+CAST(Employeeid AS VARCHAR)+”” queryout “C:Temppedidos_filial”+CAST(Employeeid AS VARCHAR)+”.txt” -w -t”|” -T -S”
”+@@servername+”””” ” FROM (SELECT DISTINCT Employeeid FROM Northwind..Orders)x ‘,N’Northwind’ 


Como você poder ver, a xp_execresultset pode ser a solução para o nosso problema. Melhora nossa performance e elimina o uso do cursor. Sendo assim, sempre que possível faça uso desta extend.


Nota: Caso tenha ficado qualquer dúvida sobre a utilização desta extended, lembrem-se que vocês podem estar utilizando os fóruns para solucionar tais dúvidas.

Avaliação:
Compartilhe:
  • Anterior SQL Dinâmico ou Stored Procedure20 anos atrás
  • Próximo RETORNO DE TRIGGERS20 anos atrás

Deixe uma resposta Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

MVP Reconnect Award

Categorias

  • Artigos (359)
  • Dica da Semana (95)
  • Documentação (54)
  • Downloads (113)
  • MSDE 2000 (3)
  • Sem categoria (1)
  • Tutoriais (9)

Posts recentes

  • #FechouBrasil #PartiuPortugal
  • Brigando com o erro “The cached MSI file is missing”
  • MCDBABRASIL está de volta
  • Documentando o Servidor SQL Server
  • Brigando com os Erros 17182, 17826 e 17120

SQL Server AlwaysOn Video Series

Video1: Introdução ao SQLServer2012 AlwaysOn


Video2: Introdução ao SQLServer2012 AlwaysOn Availability Group


Video3: Introdução ao SQLServer2012 AlwaysOn AVG-Demo


Video4: Introdução ao SQLServer2012 AlwaysOn Listener


Video5: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries


Video6: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries-Demo


Video7: Introdução ao SQLServer2012 AlwaysOn Failover Clustering


Serie SQL Server Failover Clustering End-to-End

Parte 1: Configuração da Rede e Ambiente


Parte 2: Configurando o Windows 2008 R2 Domain Controler e DNS


Parte 3: Preparando os nós para o Failover Cluster


Parte 4: Configurando um Failover Cluster de 2 nós


Parte 5: Configurando as LUNs no iSCSI Software Target (Parte 1)


Parte 6: Configurando as LUNs no iSCSI Software Target (Parte 2)


Parte 7: Apresentando as LUNs para os nós do Failover Cluster


Parte 8: Configurando os discos no Failover Cluster


Parte 9: Instalando a primeira instância virtual do SQL Server 2008


Parte 10: Instalando a segunda instância virtual do SQL Server 2008


Parte 11: Instalando e Configurando o MSDTC no Failover Cluster


Parte 12: Configurando Mount Points no Cluster e SQL Server 2008


Vídeo Extra: Removendo uma Instância do SQL Server 2008 R2 em Cluster


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering Overview


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering na Prática

Menu

  • Home
  • Sobre
  • Contato

Mais

  • RSS Feeds
2026 MCDBA Brasil.