Vi må skrive SELECT-søkeresultatene til en csv-fil. Hvordan kan det gjøres ved hjelp av T-SQL i SQL Server 2008 R2? Jeg vet at det kan gjøres i SSIS, men av noen grunner har vi ikke dette alternativet.

Jeg prøvde å bruke den foreslåtte prosessen i artikkelen nedenfor, men når jeg kjører prosessen, SQL klager som ikke kan kjøre sys.sp_OACreate og sys.sp_OADestroy som kalles i denne pros.

Vet du hvordan vi kan slå på disse komponentene eller vet vi noen bedre måte å skrive til en fil ved hjelp av T-SQL?

Takk på forhånd.

Svar

Bruk BCP-verktøy

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

-c -argumentet spesifiserer c tegnutgang, i motsetning til SQLs opprinnelige binære format; dette er standard som tabulatoradskilte verdier, men -t , endrer feltet t erminator til kommaer. -T spesifiserer Windows-autentisering (« t rusten tilkobling «), bruk ellers -U MyUserName -P MyPassword.

Dette eksporterer ikke kolonneoverskrifter som standard. Du må bruke en UNION ALL for overskrifter

ELLER

Bruk SQLCMD

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

ELLER

Bruk Powershell

Her er en lenke til en artikkel . Hvis du ender opp med å bruke dette, vil du kanskje legge til -notype etter Export-Csv $extractFile for å bli kvitt den unødvendige kolonnen i utdatafilen.

Kommentarer

  • +1 For BCP-verktøy – det er veldig enkelt å bruke, det er det raskeste verktøyet jeg noensinne har brukt til eksport / import informasjon, og det er mange alternativer. Jeg vil råde deg til å legge til » > FileName.log » på slutten av uttalelse – dette vil opprette en loggfil.
  • Ethvert svar som involverer et GUI-program er rett og slett utenfor omfanget. Dette er den beste løsningen fra et DBA-synspunkt!

Svar

Legger til forrige svar, som hjelper deg med å automatisere handlingen, hvis du bare trenger det fra tid til annen, kan du gjøre det i Management Studio, bare høyreklikk på overskriften – Lagre resultater som -> velg en. csv-fil .

Eller hvis du vil gjøre det for hvert utvalgte utsagn du kjører, kan du endre resultatets retning for en fil. Bruk Verktøy -> Alternativer -> Spørringsresultater – Resultater til fil .

En annen måte som kan bli enkelt automatisert, og bruker SSIS, er ved å bruke Management Studios eksportdata-funksjon. Høyreklikk på databasen -> Oppgaver -> Eksporter data. Det er en veiviser med mange alternativer der. Du bør velge kildedatabase, destinasjon og andre alternativer. For destinasjonen må du sørge for at den er flat fil, bla gjennom og velg .csv-type , velg hvilken formatering du trenger, og til slutt får du en SSIS-pakke som kan lagres lokalt og gjentas etter behov.

Svar

Bruk 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 det er et par advarsler:

  1. Du må ha Microsoft.ACE.OLEDB.12.0-leverandøren tilgjengelig. Jet 4.0-leverandøren vil også fungere, men den er eldgammel, så jeg brukte denne i stedet.
  2. .CSV-filen må eksistere allerede. Hvis du bruker topptekster (HDR = YES) , sørg for at første linje i .CSV-filen er en avgrenset liste over alle feltene.

Kommentarer

  • Beste svaret så langt!
  • flott jobb inkludert advarsler
  • En advarsel til: du kan trenge tillatelser, ellers vil du se: Msg 15281, nivå 16, tilstand 1, linje 2 SQL Server blokkerte tilgang til UTTALELSE ‘ OpenRowset / OpenDatasource ‘ av komponent ‘ Distribuerte ad hoc-spørsmål ‘ fordi denne komponenten er slått av som en del av sikkerhetskonfigurasjonen for denne serveren. En systemadministrator kan aktivere bruk av ‘ Ad Hoc Distribuerte spørsmål ‘ ved å bruke sp_configure. For mer informasjon om aktivering av ‘ Ad Hoc-distribuerte spørsmål ‘, søk etter ‘ Ad Hoc Distribuerte spørsmål ‘ 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 kolonnenavn, og skriver ut NULL overalt.

Svar

Det ser ut til at du allerede har en akseptabel løsning, men hvis du har satt opp db-e-post potensielt kan gjøre noe slikt:

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 uansett sender e-post til filen et sted, kan det spare deg for noen få trinn.

Kommentarer

  • Akkurat det jeg lette etter, kudos til deg!
  • Selv om du må legge til parameteren @profile_name hvis du ikke har noen standard privat profil for brukeren din eller offentlig profil for databasen.

Svar

Dette kan enkelt gjøres i 3 trinn prosess:

  1. Skriv spørringen din som et SELECT INTO -spørsmål. Dette vil i hovedsak eksportere søkeresultatene dine til en tabell.

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

    Merk, denne tabellen kan ikke eksisterer når spørringen kjører, da denne typen spørsmål vil opprette tabellen som en del av utførelsen.

  2. Bruk deretter SSIS til å eksportere resultatene av tabellen til .csv. Veiviseren for SSIS-eksport lar deg velge skilletegn osv. Dette er veldig nyttig for bruk av | skilletegn i tilfeller der resultatsettet inneholder kommaer.

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

  3. Når eksporten er fullført, utfør DROP TABLE kommando for å rydde opp loggbordet.

    Drop Table dbo.LogTableName 

Kommentarer

  • Hei Don. Jeg la til litt formatering i svaret ditt. Du kan klikke på ‘ redigere ‘ nede til venstre for å se hva ‘ endret og klikk på » redigert » xx minutter » bit for å se en full historie hvis du vil rulle tilbake. Selv om det er brukbart, tilføyer ikke svaret ditt ‘ mye over det ‘ som allerede er skrevet, og det vil neppe vekke mye oppmerksomhet.

Svar

Denne prosedyren vil generere en CSV-fil med utdataene fra spørringen du sender som parameter. Den andre parameteren er CSV-filnavnet ditt. Pass på at du sender filnavnet med en gyldig skrivbar bane.

Her er skriptet for å opprette prosedyren:

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 bare svar er ikke ‘ ikke sett på som akseptabelt her – kan du legge til noen kommentarer til svaret ditt og hvorfor det fungerer? (kodekommentarer vil sannsynligvis hjelpe her også)
  • Ja, og kan du også legge til et eksempel på hvordan du lykkes med å bruke det?

Svar

Jeg bruker MS Access DoCMD for å eksportere CSV «fra SQL Server. Det er i stand til å gjøre det med en enkelt kommando. Tilgangsdatabasen brukes bare til å aktivere tilgangskommandoen. Det fungerer bra, og som en ekstra fordel (ikke sikker på hvorfor) skaper det et schema.ini for den eksporterte tabellen.

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" 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *