Vi skal skrive SELECT-forespørgselsresultaterne til en csv-fil. Hvordan kan det gøres ved hjælp af T-SQL i SQL Server 2008 R2? Jeg ved, at det kan gøres i SSIS, men af nogle grunde har vi ikke denne mulighed.

Jeg forsøgte at bruge den foreslåede proc i artiklen nedenfor, men når jeg kører proc, SQL klager, der ikke kan køre sys.sp_OACreate og sys.sp_OADestroy, som kaldes i denne proc.

Ved du, hvordan vi kan tænde disse komponenter eller kender nogen bedre måde at skrive til en fil ved hjælp af T-SQL?

På forhånd tak.

Svar

Brug BCP-værktøj

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

Argumentet -c angiver c tegn til output, i modsætning til SQLs oprindelige binære format; dette er standardtabsseparerede værdier, men -t , ændrer feltet t erminator til kommaer. -T angiver Windows-godkendelse (“ t rusten forbindelse “), ellers brug -U MyUserName -P MyPassword.

Dette eksporterer ikke kolonneoverskrifter som standard. Du skal bruge en UNION ALL til overskrifter

ELLER

Brug SQLCMD

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

ELLER

Brug Powershell

Her er et link til en artikel . Hvis du ender med at bruge dette, vil du muligvis tilføje -notype efter Export-Csv $extractFile for at slippe af med den unødvendige kolonne i outputfilen.

Kommentarer

  • +1 For BCP-værktøjet – det er meget nemt at bruge, det er det hurtigste værktøj, jeg nogensinde har brugt til eksport / import information, og der er mange muligheder. Jeg vil råde dig til at tilføje ” > FileName.log ” i slutningen af erklæring – dette opretter en logfil.
  • Ethvert svar, der involverer et GUI-program, er simpelthen uden for anvendelsesområdet. Dette er den bedste løsning set fra et DBA-synspunkt!

Svar

Tilføjelse til det forrige svar, som hjælper dig med at automatisere handlingen, hvis du kun har brug for det fra tid til anden, kan du gøre det i Management Studio, skal du blot højreklik på overskriften – Gem resultater som -> vælg en. csv-fil .

Eller hvis du vil gøre det for hver valgt sætning, du kører, kan du ændre outputretningen for resultaterne til en fil. Brug Værktøjer -> Indstillinger -> Forespørgselsresultater – Resultater til fil .

En anden måde, der kan automatiseres let og gør brug af SSIS ved hjælp af Management Studios eksportdata-funktion. Højreklik på databasen -> Opgaver -> Eksportér data. Der er en guide med mange muligheder der. Du skal vælge kildedatabasen, destinationen og andre muligheder. For destinationen skal du sørge for, at den er flad fil, gennemse og vælge .csv-type , vælg hvilken formatering du har brug for, og i slutningen får du en SSIS-pakke, der kan gemmes lokalt og gentages efter behov.

Svar

Brug 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 

Men der er et par advarsler:

  1. Du skal have Microsoft.ACE.OLEDB.12.0-udbyderen tilgængelig. Jet 4.0-udbyderen fungerer også, men den er gammel, så jeg brugte denne i stedet.
  2. .CSV-filen skal allerede eksistere. Hvis du bruger overskrifter (HDR = YES) , sørg for, at den første linje i .CSV-filen er en afgrænset liste over alle felter.

Kommentarer

  • Bedste svar så langt!
  • godt stykke arbejde inklusive advarsler
  • Endnu en advarsel: du har muligvis brug for tilladelser, ellers vil du se: Msg 15281, niveau 16, tilstand 1, linje 2 SQL Server blokeret adgang til ERKLÆRING ‘ OpenRowset / OpenDatasource ‘ af komponent ‘ Ad hoc-distribuerede forespørgsler ‘ fordi denne komponent er slukket som en del af sikkerhedskonfigurationen for denne server. En systemadministrator kan aktivere brugen af ‘ Ad hoc-distribuerede forespørgsler ‘ ved hjælp af sp_configure. For mere information om aktivering af ‘ Ad hoc-distribuerede forespørgsler ‘, søg efter ‘ Ad Hoc Distribuerede forespørgsler ‘ i SQL Server Books Online.

Svar

Lavteknologisk, men …

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

Kommentarer

  • MySQL behandler col1 + ',' + cast(col2 as varchar(10)) + ',' + col3 som et kolonnenavn og udskriver NULL overalt.

Svar

Det ser ud til, at du allerede har en acceptabel løsning, men hvis du har konfigureret db-mail potentielt kunne gøre noget som dette:

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 

Hvis du alligevel sender en e-mail til filen et eller andet sted, kan det spare dig for et par trin.

Kommentarer

  • Lige hvad jeg ledte efter, kudos til dig!
  • Selvom du bliver nødt til at tilføje parameteren @profile_name, hvis du ikke har nogen standard privat profil til din bruger eller offentlig profil til databasen.

Svar

Dette kan let gøres i 3 trin proces:

  1. Skriv din forespørgsel som en SELECT INTO forespørgsel. Dette vil i det væsentlige eksportere dine forespørgselsresultater til en tabel.

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

    Bemærk, denne tabel kan ikke findes, når forespørgslen kører, da denne type forespørgsel vil oprette tabellen som en del af udførelsen.

  2. Brug derefter SSIS til at eksportere resultaterne af denne tabel til .csv. Guiden SSIS Export lader dig vælge din afgrænser osv. Dette er virkelig praktisk til brug af en | afgrænsning i tilfælde, hvor resultatsættet indeholder kommaer.

    Højreklik på DB Name > Tasks > Export Data

  3. Når eksporten er afsluttet, skal du udføre DROP TABLE kommando til oprydning af din logtabel.

    Drop Table dbo.LogTableName 

Kommentarer

  • Hej Don. Jeg tilføjede nogle formateringer til dit svar. Du kan klikke på ‘ redigere ‘ i nederste venstre hjørne for at se, hvad ‘ s ændret og klik på ” redigeret ” xx minutter ” bit for at se en fuld historik hvis du vil rulle tilbage. Selvom det er praktisk, tilføjer dit svar ‘ ikke meget over, hvad ‘ allerede er skrevet og sandsynligvis ikke vil tiltrække megen opmærksomhed.

Svar

Denne procedure genererer en CSV-fil med output fra den forespørgsel, du sender som parameter. Den 2. parameter er dit CSV-filnavn. Sørg for at sende filnavnet med en gyldig skrivbar sti.

Her er scriptet til oprettelse af proceduren:

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 

Kommentarer

  • kode svares kun ‘ t betragtes som acceptabelt her – kan du tilføje nogle kommentarer til dit svar, og hvorfor det fungerer? (kodekommentarer vil sandsynligvis også hjælpe her)
  • Ja, og kan du også tilføje et eksempel på, hvordan du med succes bruger det?

Svar

Jeg bruger MS Access DoCMD til at eksportere CSV “fra SQL Server. Det er i stand til at gøre det med en enkelt kommando. Adgangsdatabasen bruges kun til at aktivere adgangskommandoen. Det fungerer godt, og som en ekstra fordel (ikke sikker på hvorfor) opretter det et skema.ini for den eksporterede tabel.

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" 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *