Exportar resultado da consulta para o arquivo .csv no SQL Server 2008

141

Como posso exportar um resultado da consulta para um arquivo .csv no SQL Server 2008?

Ouro
fonte
Você precisa que seu delimitador tenha escapado? A maioria das respostas até agora pressupõe que você não, o que não é realmente tudo o que CSV.
Nick
@ Nick - geralmente os delimitadores são contidos apenas com uma string e geralmente possuem aspas. Veja minha resposta para ver a solução para isso. stackoverflow.com/questions/6115054/…
MacGyver
Às vezes eu uso Python
LV98

Respostas:

168
  1. Abra o SQL Server Management Studio
  2. Vá para Ferramentas> Opções> Resultados da consulta> SQL Server> Resultados para texto
  3. Na extrema direita, há uma caixa suspensa chamada Formato de saída
  4. Escolha Delimitado por vírgulas e clique em OK

Aqui está uma versão em tela cheia dessa imagem, abaixo

insira a descrição da imagem aqui

Isso exibirá os resultados da sua consulta como texto delimitado por vírgula.

Para salvar os resultados de uma consulta em um arquivo: Ctrl + Shift + F

8kb
fonte
10
A resposta é um pouco enganadora ... Quando você pressiona Ctrl+Shift+F, apenas altera o modo de saída, não afeta os resultados se você já executou a consulta. Para que isso seja refletido, você deve executar novamente a consulta. Ao executá-lo no modo "Resultados em arquivo", ele deve ser solicitado onde você deseja salvar os resultados.
precisa
3
Deve ser Vá para Ferramentas> Opções> Resultados da Consulta> SQL Server > Resultados para Texto
congusbongus
45
Voltar a executar a consulta não foi suficiente para mim. Eu tive que fechar a janela de consulta, abrir uma nova e executar a consulta novamente.
Breandán
3
Comentário confirmado em Breandán. As novas configurações não se aplicarão à janela de consulta aberta no momento, devem fechá-las e executar novamente a consulta.
Shinigamae
3
Uma coisa que tive que fazer foi exportá-lo como a extensão RPT padrão. Depois de fazer isso, você pode simplesmente renomeá-lo para um CSV e ele funciona.
Thomas Bennett
140

Eu sei que isso é um pouco antigo, mas aqui está uma maneira muito mais fácil ...

  1. Execute sua consulta com as configurações padrão (coloca os resultados no formato de grade, se o seu não estiver no formato de grade, veja abaixo)

  2. Clique com o botão direito do mouse nos resultados da grade e clique em "Salvar resultados como" e salve-o.

Se seus resultados não estiverem no formato de grade, clique com o botão direito do mouse em onde você escreve a consulta, passe o mouse em "Resultados para" e clique em "Resultados na grade"

Lembre-se de que você NÃO captura os cabeçalhos das colunas!

Boa sorte!

Ricketts
fonte
1
O único problema é que esse método parece não permitir que você defina nenhuma opção. Por exemplo, todos os NULLs aparecem nos arquivos de saída como "NULL", etc. Talvez exista uma maneira de definir isso que eu não conheço.
Noé
13
Surpreendentemente, mesmo no SSMS 2012, isso não cita corretamente o texto para CSV. Uma vírgula ou nova linha dentro de um CHAR / VARCHAR deve ser citada, mas não é. Isso faz com que os dados mudem para novas colunas ou para uma nova linha.
Eric J.
4
Também não fornece cabeçalhos de coluna.
Don
8
@Don isto faz cabeçalhos das colunas dar se você entrar em "Consulta" -> "Opções de consulta ...", guia de grade, e marque a opção "incluir cabeçalhos de coluna quando copiar ou salvar resultados"
Rob Sábio
7
Essa deve ser a resposta.
Psp2
46

Você pode usar o PowerShell

$AttachmentPath = "CV File location"
$QueryFmt= "Query"

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath
NS
fonte
Obrigado! Essa foi a única sugestão que funcionou para mim. Alças escapando corretamente
emertechie
3
+10 se eu pudesse. Apenas responda que lida com a fuga. Para que isso funcionasse, tive que adicionar duas linhas na parte superior do script: Add-PSSnapin SqlServerCmdletSnapin100e Add-PSSnapin SqlServerProviderSnapin100.
Eric J.
se você enfrentar tempo de espera adicionar o querytimeout assim por exemploInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo
1
Como novato no Powershell, eu precisava instalar o Módulo SqlServer: Install-Module -Name SqlServer(mas não precisava encaixar esses cmdlets). Além disso, eu tinha guardado os comandos em um script, o que não seria executado até que eu tivesse mudado a política de execução: Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser.
sandyscott 19/12/19
@sandyscott Eu também sou um novato em PowerShell, então obrigado. Enfim, acho que, neste caso, uma RemoteSignedpolítica de execução será suficiente.
BigBother
14

Se o banco de dados em questão for local, provavelmente é a maneira mais robusta de exportar um resultado de consulta para um arquivo CSV (ou seja, oferecendo mais controle).

  1. Copie a consulta.
  2. No Pesquisador de Objetos, clique com o botão direito do mouse no banco de dados em questão.
  3. Selecione "Tarefas" >> "Exportar dados ..."
  4. Configure sua fonte de dados e clique em "Avançar".
  5. Escolha "Arquivo Simples" ou "Microsoft Excel" como destino.
  6. Especifique um caminho de arquivo.
  7. Se estiver trabalhando com um arquivo simples, configure como desejado. Se estiver trabalhando com o Microsoft Excel, selecione "Excel 2007" (as versões anteriores têm um limite de linhas em 64k)
  8. Selecione "Escreva uma consulta para especificar os dados a serem transferidos"
  9. Cole a consulta da Etapa 1.
  10. Clique em Avançar >> revisar mapeamentos >> clique em Avançar >> selecione "executar imediatamente" >> clique em "Concluir" duas vezes.

Depois de passar por esse processo exaustivamente, achei a seguinte a melhor opção

Script do PowerShell

$dbname = "**YOUR_DB_NAME_WITHOUT_STARS**"
$AttachmentPath = "c:\\export.csv"
$QueryFmt= @"
**YOUR_QUERY_WITHOUT_STARS**
"@

Invoke-Sqlcmd   -ServerInstance **SERVER_NAME_WITHOUT_STARS** -Database  $dbname -Query $QueryFmt | Export-CSV $AttachmentPath -NoTypeInformation

Execute o PowerShell como administrador

& "c:\path_to_your_ps1_file.ps1"
pimbrouwers
fonte
1
se você enfrentar tempo de espera adicionar o querytimeout assim por exemploInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo
6

MS Excel -> Dados -> Nova Consulta -> Do Banco de Dados .. siga as etapas

tichra
fonte
6

Com base na resposta do NS, tenho um script do PowerShell que exporta para um arquivo CSV com aspas ao redor do campo e separados por vírgula e ignora as informações do cabeçalho no arquivo.

add-pssnapin sqlserverprovidersnapin100
add-pssnapin sqlservercmdletsnapin100

$qry = @"
Select
  *
From
 tablename
"@

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $qry | convertto-CSV -notype | select -skip 1  > "full path and filename.csv"

As duas primeiras linhas permitem a capacidade de usar o comando Invoke-SqlCmd -let.

BeowulfNode42
fonte
6

Use T-SQL :

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

Mas há algumas ressalvas:

  1. Você precisa ter o provedor Microsoft.ACE.OLEDB.12.0 disponível. O provedor Jet 4.0 também funcionará, mas é antigo, então usei este.

  2. O arquivo .CSV já deverá existir. Se você estiver usando cabeçalhos ( HDR=YES), verifique se a primeira linha do arquivo .CSV é uma lista delimitada de todos os campos.

Slogmeister Extraordinaire
fonte
3

O uso da técnica nativa do SQL Server Management Studio para exportar para CSV (como sugerido em 8kb) não funcionará se seus valores contiverem vírgulas, porque o SSMS não quebra valores entre aspas duplas. Uma maneira mais robusta que funcionou para mim é simplesmente copiar os resultados (clique dentro da grade e, em seguida, CTRL-A, CTRL-C) e colá-lo no Excel. Em seguida, salve como arquivo CSV no Excel.

Johnny Oshika
fonte
2

Você pode usar o QueryToDoc ( http://www.querytodoc.com ). Permite escrever uma consulta em um banco de dados SQL e exportar os resultados - depois de escolher o delimitador - para Excel, Word, HTML ou CSV

Robert
fonte
2
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

como @Slogmeister Extraordinaire Quoted está correto.

É necessário ter 1> Arquivo já presente nas colunas 2> É necessário ter o Office instalado

Erros enfrentados

1

Mensagem 7303, nível 16, estado 1, linha 1 Não é possível inicializar o objeto de fonte de dados do provedor OLE DB "Microsoft.ACE.OLEDB.12.0" para o servidor vinculado "(nulo)". "

64 bits http://download.microsoft.com/download/2/4/3/24375141-E08D-4803-AB0E-10F2E3A07AAA/AccessDatabaseEngine_x64.exe

32 bits http://download.microsoft.com/download/f/d/8/fd8c20d8-e38a-48b6-8691-542403b91da1/AccessDatabaseEngine.exe

2

A mensagem 15281, nível 16, estado 1, linha 1 do SQL Server bloqueou o acesso à DECLARAÇÃO 'OpenRowset / OpenDatasource' do componente 'Consultas Distribuídas Ad Hoc' porque esse componente está desativado como parte da configuração de segurança deste servidor. Um administrador do sistema pode ativar o uso de 'Consultas distribuídas ad hoc' usando sp_configure. Para obter mais informações sobre como ativar 'Consultas distribuídas ad hoc', procure 'Consultas distribuídas ad hoc' nos Manuais Online do SQL Server.

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO
sam
fonte
2

Se você não quiser usar o Powershell, esta resposta é uma variação da ótima resposta de 8kb. A única diferença é que, em vez de selecionar CSV como formato de saída, selecione Delimitado por tabulação. Dessa forma, se houver vírgulas nos seus dados, ele não pulará as células no Excel. Além disso, se você tiver o delimitador padrão do Excel definido como guias, poderá simplesmente copiar todos os resultados da consulta SSMS (CTRL-A, CTRL-C) e colar no Excel (não é necessário salvar como arquivo e importar para o Excel ):

  • No SSMS, vá para Ferramentas> Opções> Resultados da Consulta> SQL Server> Resultados no Texto
  • Altere o formato de saída à direita para Delimitado por tabulações
  • Clique OK

Agora você pode executar sua consulta, depois fazer um CTRL-A para selecionar todos os resultados, depois CTRL-C para copiar para a área de transferência, depois mudar para o Excel 2013 (pode também funcionar em 2007 também) e colar - assumindo o padrão do Excel delimitador está definido para tab.

Imagem da tela Opções de consulta do SSMS

TomWalker
fonte
-1

Sim, tudo isso é possível quando você tem acesso direto aos servidores. Mas e se você tiver apenas acesso ao servidor a partir de um servidor de aplicativos / web? Bem, a situação era essa conosco há muito tempo e a solução foi o SQL Server Export to CSV .

Jiju Thomas Mathew
fonte
Link ... Acesso negado?
hoggar