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.
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.
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.
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í:
Nízká technologie, ale ...
select
col1 + ','
+ cast(col2 as varchar(10)) + ','
+ col3
from mytable;
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ů.
To lze snadno provést ve třech krocích:
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í.
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
Po dokončení exportu spusťte příkaz DROP TABLE
A vyčistěte tabulku protokolu.
Drop Table dbo.LogTableName
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"