AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 23566
Accepted
Sky
Sky
Asked: 2012-09-03 18:39:56 +0800 CST2012-09-03 18:39:56 +0800 CST 2012-09-03 18:39:56 +0800 CST

Escrevendo o resultado selecionado em um arquivo csv

  • 772

Precisamos gravar os resultados da consulta SELECT em um arquivo csv. Como isso pode ser feito usando o T-SQL no SQL Server 2008 r2? Eu sei que isso pode ser feito no SSIS, mas por alguns motivos, não temos essa opção.

Tentei usar o proc sugerido no artigo abaixo, mas quando executo o proc, o SQL reclama que não consegue executar sys.sp_OACreate e sys.sp_OADestroy que são chamados neste proc.

Você sabe como podemos ativar esses componentes ou conhece alguma maneira melhor de gravar em um arquivo usando T-SQL?

Desde já, obrigado.

sql-server-2008 t-sql
  • 8 8 respostas
  • 324092 Views

8 respostas

  • Voted
  1. Best Answer
    RK Kuppala
    2012-09-03T21:32:04+08:002012-09-03T21:32:04+08:00

    Usar utilitário BCP

    bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T
    

    O -cargumento especifica a saída do caractere c , em oposição ao formato binário nativo do SQL; esse padrão é para valores separados por tabulação, mas -t ,altera o t erminador de campo para vírgulas. especifica a-T autenticação do Windows (" conexão enferrujada"), caso contrário, use .-U MyUserName -P MyPassword

    Isso não exporta cabeçalhos de coluna por padrão. Você precisa usar um UNION ALL para cabeçalhos

    OU

    Usar SQLCMD

    SQLCMD -S SERVERNAME -E -Q "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable"
    -s "," -o "D:\MyData.csv" 
    

    OU

    Usar Powershell

    Aqui está um link para um artigo . Se você acabar usando isso, convém anexar -notypedepois Export-Csv $extractFilepara se livrar da coluna desnecessária no arquivo de saída.

    • 60
  2. Marian
    2012-09-04T05:29:12+08:002012-09-04T05:29:12+08:00

    Adicionando à resposta anterior, que ajuda você a automatizar a ação, se você precisar apenas de vez em quando pode fazê-lo no Management Studio, basta clicar com o botão direito do mouse no cabeçalho - Salvar resultados como -> escolher um arquivo .csv .

    Ou se você quiser fazer isso para cada instrução select executada, poderá alterar a direção de saída dos resultados para um arquivo. Use Ferramentas -> Opções -> Resultados da consulta - Resultados para arquivo .

    Outra maneira, que pode ser automatizada facilmente, e faz uso do SSIS, é usando o recurso Exportar Dados do Management Studio. Clique com o botão direito do mouse no banco de dados -> Tarefas -> Exportar dados. Há um assistente com muitas opções lá. Você deve escolher o banco de dados de origem, o destino e outras opções. Para o destino certifique-se que é "Flat file", navegue e escolha o tipo .csv, escolha a formatação que você precisa e no final você obterá um pacote SSIS que pode ser salvo localmente e repetido quando necessário.

    • 27
  3. Slogmeister Extraordinaire
    2014-01-23T07:10:25+08:002014-01-23T07:10:25+08:00

    Usar 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á deve existir. Se você estiver usando cabeçalhos (HDR=YES), certifique-se de que a primeira linha do arquivo .CSV seja uma lista delimitada de todos os campos.
    • 11
  4. Shane Estelle
    2014-01-23T11:46:35+08:002014-01-23T11:46:35+08:00

    Parece que você já tem uma solução aceitável, mas se você tiver o db mail configurado, poderá fazer algo assim:

    EXEC msdb.dbo.sp_send_dbmail
        @recipients='[email protected]',
        @subject='CSV Extract', 
        @body='See attachment',
        @query ='SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable',
        @attach_query_result_as_file = 1,
        @query_attachment_filename = 'CSV_Extract.txt',
        @query_result_separator = ',',
        @query_result_header = 1
    

    Se você estiver enviando o arquivo por e-mail para algum lugar de qualquer maneira, poderá economizar algumas etapas.

    • 6
  5. Alain
    2014-09-19T09:51:03+08:002014-09-19T09:51:03+08:00

    Baixa tecnologia, mas...

    select
       col1 + ','
    +  cast(col2 as varchar(10)) + ','
    +  col3
    from mytable;
    
    • 5
  6. Don Moehling
    2016-11-09T09:21:34+08:002016-11-09T09:21:34+08:00

    Isso pode ser feito facilmente em um processo de 3 etapas:

    1. Escreva sua consulta como uma SELECT INTOconsulta. Isso basicamente exportará os resultados da consulta para uma tabela.

      Select
        Field1
       ,Field2
       ,Field3
      INTO dbo.LogTableName         --Table where the query Results get logged into.
      From Table
      

      Observe que essa tabela não pode existir quando a consulta é executada, pois esse tipo de consulta deseja criar a tabela como parte da execução.

    2. Em seguida, use o SSIS para exportar os resultados dessa tabela para o .csv. O assistente de exportação do SSIS permite que você escolha seu delimitador, etc. Isso é realmente útil para usar um | delimitador em instâncias em que o conjunto de resultados contém vírgulas.

      Clique com o botão direito emDB Name > Tasks > Export Data

    3. Quando a exportação estiver concluída, execute o DROP TABLEcomando para limpar sua tabela de log.

      Drop Table dbo.LogTableName
      
    • 1
  7. Adam
    2019-09-29T06:43:42+08:002019-09-29T06:43:42+08:00

    Eu uso o MS Access DoCMD para exportar CSVs do SQL Server. É capaz de fazê-lo com um único comando. O banco de dados de acesso é usado apenas para habilitar o comando de acesso. Ele tem um bom desempenho e, como um benefício adicional (não sei por que), cria um schema.ini para a tabela exportada.

    Adão

    CMD="SELECT * INTO [Text;HDR=Yes;DATABASE=C:\].[Results.txt]  
    FROM [ODBC;DSN=SQL2017;Description=SQL2017;UID=.;Trusted_Connection=Yes;APP=Microsoft Office 2013;WSID=LAPTOP-XYZ;DATABASE=TempDB_DataDump_1].Results "
    
     Set appAccess = CreateObject("Access.Application") 
                    appAccess.OpenCurrentDatabase "anyAccessdatabase.mdb" 
                       ' appAccess.DoCmd.SetWarnings 0
                        appAccess.DoCmd.runsql "CMD"
    
    • 1
  8. Pareed Sharief
    2019-04-05T10:15:12+08:002019-04-05T10:15:12+08:00

    Este procedimento gerará um arquivo CSV com a saída da consulta que você passar como parâmetro. O segundo parâmetro é o nome do seu arquivo CSV, certifique-se de passar o nome do arquivo com um caminho gravável válido.

    Aqui está o script para criar o procedimento:

    CREATE procedure [dbo].[usp_create_csv_file_from_query]
        @sql Nvarchar(MAX),
        @csvfile Nvarchar(200)
        as
        BEGIN
            if IsNull(@sql,'') = '' or IsNull(@csvfile,'') = ''
            begin
                RAISERROR ('Invalid SQL/CsvFile values passed!; Aborting...', 0, 1) WITH NOWAIT
                return
            end
            DROP TABLE if exists global_temp_CSVtable;
            declare 
                @columnList varchar(4000), 
                @columnList1 varchar(4000),
                @sqlcmd varchar(4000),
                @dos_cmd nvarchar(4000)
    
            set @sqlcmd = replace(@sql, 'from', 'into global_temp_CSVtable from')
            EXECUTE (@sqlcmd); 
    
            declare @cols table (i int identity, colname varchar(100))
            insert into @cols
            select column_name
            from information_schema.COLUMNS
            where TABLE_NAME = 'global_temp_CSVtable'
    
            declare @i int, @maxi int
            select @i = 1, @maxi = MAX(i) from @cols
    
            while(@i <= @maxi)
            begin
                select @sql = 'alter table global_temp_CSVtable alter column [' + colname + '] VARCHAR(max) NULL'
                from @cols
                where i = @i
                exec sp_executesql @sql
                select @i = @i + 1
            end
    
            SELECT 
                 @columnList = COALESCE(@columnList + ''', ''', '') + column_name 
                ,@columnList1 = COALESCE(@columnList1 + ', ', '') + column_name
            from information_schema.columns
            where table_name =  'global_temp_CSVtable'
            ORDER BY ORDINAL_POSITION;
    
            SELECT @columnList = '''' + @columnList + '''';
    
            SELECT @dos_cmd='BCP "SELECT ' + @columnList + 
                            ' UNION ALL ' +
                            'SELECT * from ' + db_name() + '..global_temp_CSVtable" ' + 
                            'QUERYOUT ' + @csvfile + 
                            ' -c -t, -T'
            exec master.dbo.xp_cmdshell @dos_cmd, No_output 
            DROP TABLE if exists global_temp_CSVtable;
        end
    
    • 0

relate perguntas

  • Melhores práticas para conectar bancos de dados que estão em diferentes regiões geográficas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve