Trebuie să scriem rezultatele interogării SELECT într-un fișier csv. Cum se poate face folosind T-SQL în SQL Server 2008 r2? Știu că se poate face în SSIS, dar din anumite motive, nu avem această opțiune.

Am încercat să folosesc procurile sugerate în articolul de mai jos, dar când rulez proc, SQL se plânge că nu poate rula sys.sp_OACreate și sys.sp_OADestroy care sunt numite în acest proc.

Știți cum putem activa aceste componente sau cunoașteți un mod mai bun de a scrie într-un fișier utilizând T-SQL?

Vă mulțumim anticipat.

Răspundeți

Utilizați Utilitarul BCP

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

Argumentul -c specifică c ieșire haracter, spre deosebire de formatul binar nativ al SQL; aceasta este implicită la valori separate prin tab, dar -t , schimbă câmpul t erminator în virgule. -T specifică autentificarea Windows („ t conexiune ruginită „), altfel utilizați -U MyUserName -P MyPassword.

Acest lucru nu exportă în mod implicit anteturile de coloană. Trebuie să utilizați UNION ALL pentru anteturi

SAU

Utilizați SQLCMD

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

SAU

Utilizați Powershell

Iată un link către un articol . Dacă ajungeți să utilizați acest lucru, vă recomandăm să adăugați -notype după Export-Csv $extractFile pentru a scăpa de coloana inutilă din fișierul de ieșire.

Comentarii

  • +1 Pentru utilitarul BCP – este foarte ușor de utilizat, este cel mai rapid instrument pe care l-am folosit vreodată pentru export / import informații și există o mulțime de opțiuni. Vă voi sfătui să adăugați ” > FileName.log ” la sfârșitul declarație – aceasta va crea un fișier jurnal.
  • Orice răspuns care implică un program GUI este pur și simplu în afara domeniului. Aceasta este cea mai bună soluție din punct de vedere DBA!

Răspuns

Adăugarea la răspunsul anterior, care vă ajută să automatizați acțiunea, dacă aveți nevoie doar din când în când o puteți face în Management Studio, pur și simplu faceți clic dreapta pe antet – Salvați rezultatele ca -> alegeți un. fișier csv .

Sau dacă doriți să faceți acest lucru pentru fiecare instrucțiune select pe care o executați, puteți schimba direcția de ieșire a rezultatelor într-un fișier. Utilizați Instrumente -> Opțiuni -> Rezultate interogare – Rezultate în fișierul .

Un alt mod, care poate fi automatizat cu ușurință și utilizează SSIS, utilizând funcția Export Data Management Management. Faceți clic dreapta pe baza de date -> Activități -> Exportați date. Există un expert cu multe opțiuni acolo. Ar trebui să alegeți baza de date sursă, destinația și alte opțiuni. Pentru destinație asigurați-vă că este „Fișier plat”, răsfoiți și alegeți tipul .csv , alegeți orice formatare aveți nevoie și la final veți obține un pachet SSIS care poate fi salvat local și repetat la nevoie.

Răspuns

Utilizați 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 

Dar există câteva avertismente:

  1. Trebuie să aveți furnizorul Microsoft.ACE.OLEDB.12.0 disponibil. Furnizorul Jet 4.0 va funcționa și el, dar este vechi, așa că l-am folosit în schimb.
  2. Fișierul .CSV va trebui să existe deja. Dacă folosiți anteturi (HDR = YES) , asigurați-vă că prima linie a fișierului .CSV este o listă delimitată a tuturor câmpurilor.

Comentarii

  • Cel mai bun răspuns departe!
  • treabă excelentă, inclusiv avertismente
  • Încă o avertisment: este posibil să aveți nevoie de permisiuni, altfel veți vedea: Msg 15281, Nivel 16, Stare 1, Linia 2 SQL Server a blocat accesul DECLARAȚIE ‘ OpenRowset / OpenDatasource ‘ a componentei ‘ Interogări distribuite ad hoc ‘ deoarece această componentă este dezactivată ca parte a configurației de securitate pentru acest server. Un administrator de sistem poate activa utilizarea ‘ Interogări distribuite ad hoc ‘ utilizând sp_configure. Pentru mai multe informații despre activarea ‘ Interogări distribuite ad hoc ‘, căutați ‘ Ad Hoc Interogări distribuite ‘ în SQL Server Books Online.

Răspuns

Tehnologie redusă, dar …

select col1 + "," + cast(col2 as varchar(10)) + "," + col3 from mytable; 

Comentarii

  • MySQL tratează col1 + ',' + cast(col2 as varchar(10)) + ',' + col3 ca nume de coloană și imprimă NULL peste tot.

Răspuns

Se pare că aveți deja o soluție acceptabilă, dar dacă aveți db mail configurat, ar putea face ceva de genul acesta:

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 

Dacă oricum trimiteți prin e-mail fișierul undeva, vă poate salva câțiva pași.

Comentarii

  • Exact ceea ce căutam, felicitări!
  • Deși va trebui să adăugați parametrul @profile_name dacă nu aveți un profil privat implicit pentru utilizatorul dvs. și nici profilul public pentru baza de date.

Răspuns

Acest lucru se poate face cu ușurință într-un pas 3 process:

  1. Scrieți interogarea dvs. ca o interogare SELECT INTO. Aceasta va exporta în esență rezultatele interogării dvs. într-un tabel.

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

    Notă, acest tabel nu poate există când rulează interogarea, deoarece acest tip de interogare dorește să creeze tabelul ca parte a execuției.

  2. Apoi utilizați SSIS pentru a exporta rezultatele acelui tabel la .csv. Expertul de export SSIS vă permite să alegeți delimitatorul etc. Acest lucru este foarte util pentru utilizarea unui | delimitator în cazurile în care setul de rezultate conține virgule.

    Faceți clic dreapta pe DB Name > Tasks > Export Data

  3. După finalizarea exportului, executați pentru a curăța tabelul jurnalului.

    Drop Table dbo.LogTableName 

Comentarii

  • Bună. Am adăugat o anumită formatare la răspunsul dvs. Puteți face clic pe ‘ editați ‘ în partea stângă jos pentru a vedea ce ‘ modificat și faceți clic pe ” editat ” xx minute ” pentru a vedea un istoric complet dacă vrei să te întorci. Deși funcțional, răspunsul dvs. nu ‘ nu adaugă mult peste ceea ce ‘ s-a scris deja și este puțin probabil să atragă multă atenție.

Răspuns

Această procedură va genera un fișier CSV cu ieșirea interogării pe care o treceți ca parametru. Al doilea parametru este numele fișierului dvs. CSV, asigurați-vă că treceți numele fișierului cu o cale validă de scriere.

Iată scriptul pentru a crea procedura:

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 

Comentarii

  • răspunsurile numai pentru cod nu sunt ‘ văzute ca acceptabile aici – ați putea adăuga un comentariu la răspunsul dvs. și de ce funcționează? (comentariile de cod ar ajuta probabil și aici)
  • Da și ați putea adăuga și un exemplu despre cum îl utilizați cu succes?

Răspundeți

Folosesc MS Access DoCMD pentru a exporta CSV-uri de pe SQL Server. Se poate face cu o singură comandă. Baza de date de acces este utilizată numai pentru a activa comanda de acces. Se comportă bine și, ca un avantaj suplimentar (nu sunt sigur de ce), creează un schema.ini pentru tabelul exportat.

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" 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *