it-swarm-eu.dev

Zápis výběru výsledku do souboru csv

Musíme zapsat výsledky dotazu SELECT do souboru csv. Jak to lze provést pomocí T-SQL v SQL Server 2008 r2? Vím, že to lze provést v SSIS, ale z některých důvodů tuto možnost nemáme.

Snažil jsem se použít navrhovaný proc v článku níže, ale když spustím proc, SQL si stěžuje, že nelze spustit sys.sp_OACreate a sys.sp_OADestroy, které se v tomto proc nazývají.

Víte, jak můžeme tyto komponenty zapnout, nebo znáte lepší způsob zápisu do souboru pomocí T-SQL?

Díky předem.

39
Sky

Použijte obslužný program BCP

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

Argument -c Specifikuje c výstup haracter, na rozdíl od nativního binárního formátu SQL; toto je výchozí hodnoty oddělené tabulátory, ale -t , změní pole t erminátor na čárky. -T Určuje Windows autentizaci (" t rusted connection"), jinak použijte -U MyUserName -P MyPassword.

Ve výchozím nastavení se neexportují záhlaví sloupců. Pro záhlaví musíte použít UNION ALL

OR

Použijte SQLCMD

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

OR

Použijte Powershell

Zde je odkaz na článek . Pokud to nakonec použijete, můžete přidat -notype Za Export-Csv $extractFile A zbavit se zbytečného sloupce ve výstupním souboru.

53
RK Kuppala

Přidání k předchozí odpovědi, která vám pomůže automatizovat akci, pokud ji potřebujete pouze čas od času, můžete to udělat v Management Studio, jednoduše klikněte pravým tlačítkem na záhlaví - Uložit výsledky jako -> vyberte .csv soubor.

Nebo pokud to chcete udělat pro každý spuštěný příkaz select, můžete změnit směr výstupu výsledků do souboru. Použijte Nástroje -> Možnosti -> Výsledky dotazu - Výsledky do soubor.

Dalším způsobem, který lze snadno automatizovat a využívat SSIS, je použití funkce Export dat produktu Management Studio. Klikněte pravým tlačítkem na databázi -> Úkoly -> Exportovat data. Je zde průvodce se spoustou možností. Měli byste zvolit zdrojovou databázi, cíl a další možnosti. Pro cíl se ujistěte, že se jedná o „plochý soubor“, vyhledejte a vyberte typ CSV, vyberte libovolné formátování, které potřebujete, a nakonec získáte balíček SSIS, který lze lokálně uložit a podle potřeby opakovat.

24
Marian

Použijte 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

Ale je tu několik upozornění:

  1. Musíte mít poskytovatele Microsoft.ACE.OLEDB.12.0. Poskytovatel Jet 4.0 bude fungovat také, ale je to starověké, takže jsem místo toho použil tento.
  2. Soubor .CSV bude muset již existovat. Pokud používáte záhlaví (HDR = ANO), ujistěte se, že první řádek souboru .CSV je ohraničený seznam všech polí.

Nízká technologie, ale ...

select
   col1 + ','
+  cast(col2 as varchar(10)) + ','
+  col3
from mytable;
5
Alain

Vypadá to, že již máte přijatelné řešení, ale pokud máte nastavenou poštu db, můžete potenciálně udělat něco takového:

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

Pokud soubor přesto posíláte e-mailem, může vám to ušetřit pár kroků.

4
Shane Estelle

To lze snadno provést ve třech krocích:

  1. Napište svůj dotaz jako SELECT INTO Dotaz. Výsledky dotazu se v podstatě exportují do tabulky.

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

    Tato tabulka nemůže existuje při spuštění dotazu, protože tento typ dotazu chce tabulku vytvořit jako součást provádění.

  2. Potom pomocí SSIS exportujte výsledky této tabulky na .csv. Průvodce exportem SSIS umožňuje vybrat oddělovač atd. To je opravdu užitečné pro použití | oddělovač v případech, kdy sada výsledků obsahuje čárky.

    Klikněte pravým tlačítkem na DB Name > Tasks > Export Data

  3. Po dokončení exportu spusťte příkaz DROP TABLE A vyčistěte tabulku protokolu.

    Drop Table dbo.LogTableName
    
1
Don Moehling

Používám MS Access DoCMD k exportu CSV z SQL Serveru. Dokáže to pomocí jediného příkazu. Přístupová databáze se používá pouze k povolení příkazu pro přístup. Funguje dobře a jako další výhoda (ne jistě proč) vytvoří pro exportovanou tabulku schema.ini.

Adam

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"
0
Adam