SQL Server 2008'de sorgu sonucunu .csv dosyasına aktarma


141

Bir sorgu sonucunu SQL Server 2008'de bir .csv dosyasına nasıl verebilirim?



Sınırlayıcınızın kaçmasına mı ihtiyacınız var? Şimdiye kadar cevapların çoğu bunu yapmadığını varsayar;
Nick

@Nick - genellikle sınırlayıcılar yalnızca bir dize içerir ve genellikle tırnakları vardır. Bunun çözümünü görmek için cevabımı görün. stackoverflow.com/questions/6115054/…
MacGyver


Bazen Python kullanıyorum
LV98

Yanıtlar:


168
  1. SQL Server Management Studio'yu açın
  2. Araçlar> Seçenekler> Sorgu Sonuçları> SQL Server> Metne İlişkin Sonuçlar'a gidin
  3. En sağda, Çıktı Biçimi adlı bir açılır kutu var
  4. Sınırlı Virgül'ü seçin ve Tamam'ı tıklayın

Aşağıda, bu görüntünün tam ekran sürümü

resim açıklamasını buraya girin

Bu, sorgu sonuçlarınızı virgülle ayrılmış metin olarak gösterir.

Sorgunun sonuçlarını bir dosyaya kaydetmek için: Ctrl + Shift + F


10
Cevap biraz yanıltıcıdır ... tuşuna bastığınızda Ctrl+Shift+F, yalnızca çıkış modunu değiştirir, sorguyu zaten çalıştırdıysanız sonuçları etkilemez. Bunun yansıtılması için sorguyu yeniden çalıştırmanız gerekir. "Sonuçlar Dosyaya" modunda çalıştırdığınızda, sonuçları nereye kaydetmek istediğinizi sorar.
qJake

3
Araçlar> Seçenekler> Sorgu Sonuçları> SQL Server > Metin Sonuçlarına
Git

45
Sorguyu yeniden çalıştırmak benim için yeterli değildi. Sorgu penceresini kapatmak, yeni bir pencere açmak ve sonra sorguyu yeniden çalıştırmak zorunda kaldı.
Breandán

3
@ Breandán yorumu onaylandı. Yeni ayarlar şu anda açık olan sorgu penceresine uygulanmaz, bunları kapatmalı ve sorguyu yeniden çalıştırmalıdır.
Shinigamae

3
Yapmam gereken bir şey, varsayılan RPT uzantısı olarak dışa aktarmaktı. Bunu yaptıktan sonra bir CSV olarak yeniden adlandırabilirsiniz ve çalışır.
Thomas Bennett

140

Bunun biraz eski olduğunu biliyorum, ama burada çok daha kolay bir yol var ...

  1. Sorgunuzu varsayılan ayarlarla çalıştırın (sonuçları ızgara biçiminde değilse, ızgara biçiminde koyar, aşağıya bakın)

  2. Izgara sonuçlarını sağ tıklayın ve "Sonuçları Farklı Kaydet" i tıklayın ve kaydedin.

Sonuçlarınız ızgara biçiminde değilse, sorguyu yazdığınız yeri sağ tıklayın, "Sonuçlar Kime" nin üzerine gelin ve "Izgaraya Sonuçlar" ı tıklayın

Sütun başlıklarını yakalamadığınızı unutmayın!

İyi şanslar!


1
Tek sorun, bu yöntemin herhangi bir seçenek belirlemenize izin vermiyor gibi görünmesidir. Örneğin, tüm NULL'lar çıktı dosyalarında "NULL", vb. Olarak gösterilir. Belki de bunu bilmediğim bir yol vardır.
Noah

13
Şaşırtıcı bir şekilde SSMS 2012'de bile, bu CSV için metinleri düzgün bir şekilde teklif etmiyor. CHAR / VARCHAR içindeki bir virgül veya yeni bir satır belirtilmelidir, ancak belirtilmemelidir. Bu, verilerin yeni sütunlara veya yeni bir satıra geçmesine neden olur.
Eric

4
Ayrıca sütun başlıkları vermez.
Don

8
@Don, "Sorgu" -> "Sorgu Seçenekleri ...", ızgara sekmesine giderseniz ve "sonuçları kopyalarken veya kaydederken sütun başlıklarını dahil et" seçeneğini işaretlerseniz sütun başlıkları verir
Rob Wise

7
Cevap bu olmalı.
pspahn

46

PowerShell'i kullanabilirsiniz

$AttachmentPath = "CV File location"
$QueryFmt= "Query"

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath

Teşekkür ederim! Benim için işe yarayan tek öneri buydu. Kolları düzgün kaçan
emertechie

3
Yapabilirsem +10. Sadece kaçan kolları ele alır. Bunu çalıştırmak için, senaryonun üstüne iki satır eklemek zorunda kaldım: Add-PSSnapin SqlServerCmdletSnapin100ve Add-PSSnapin SqlServerProviderSnapin100.
Eric

zaman aşımı ile karşılaşırsanız, yani zaman aşımı sorgusu ekleyinInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

1
Powershell newbie olarak SqlServer Module'ü kurmam gerekiyordu: Install-Module -Name SqlServer(fakat bu Cmdlet'leri takmak zorunda kalmadım). Ayrıca, ben yürütme politikasını değiştirdi etmişti kadar aday olmayacağını bir komut dosyası komutları, kurtaran: Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser.
sandyscott

@sandyscott Ben de Powershell acemisiyim, bu yüzden teşekkür ederim. Her neyse, bu durumda bir RemoteSignedyürütme politikasının yeterli olacağını düşünüyorum .
BigBother

14

Söz konusu veritabanı yerelse, bir sorgu sonucunu bir CSV dosyasına (yani size en fazla denetimi sağlayan) dışa aktarmanın en sağlam yolu muhtemelen aşağıdadır .

  1. Sorguyu kopyalayın.
  2. Nesne Gezgini'nde söz konusu veritabanına sağ tıklayın.
  3. "Görevler" >> "Verileri Dışa Aktar ..." ı seçin
  4. Veri kaynağınızı yapılandırın ve "İleri" yi tıklayın.
  5. Hedef olarak "Düz Dosya" veya "Microsoft Excel" i seçin.
  6. Bir dosya yolu belirtin.
  7. Düz bir dosyayla çalışıyorsanız, istediğiniz gibi yapılandırın. Microsoft Excel ile çalışıyorsanız, "Excel 2007" seçeneğini belirleyin (önceki sürümlerde 64 bin satır sınırı vardır)
  8. "Aktarılacak verileri belirtmek için bir sorgu yazın" seçeneğini belirleyin
  9. 1. Adımdaki sorguyu yapıştırın.
  10. Sonraki >> eşlemeleri incele >> sonraki >> tıklayın "hemen çalıştır" ı seçin >> "bitir" i iki kez tıklayın.

Bu süreci ayrıntılı bir şekilde inceledikten sonra, aşağıdakilerin en iyi seçenek olduğunu gördüm

PowerShell Komut Dosyası

$dbname = "**YOUR_DB_NAME_WITHOUT_STARS**"
$AttachmentPath = "c:\\export.csv"
$QueryFmt= @"
**YOUR_QUERY_WITHOUT_STARS**
"@

Invoke-Sqlcmd   -ServerInstance **SERVER_NAME_WITHOUT_STARS** -Database  $dbname -Query $QueryFmt | Export-CSV $AttachmentPath -NoTypeInformation

PowerShell'i Yönetici olarak çalıştır

& "c:\path_to_your_ps1_file.ps1"

1
zaman aşımı ile karşılaşırsanız, yani zaman aşımı sorgusu ekleyinInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

6

MS Excel -> Veri -> Yeni Sorgu -> Veritabanından .. adımları izleyin


6

NS cevabına dayanarak , alan ve virgül ayrılmış tırnak işaretleri ile bir CSV dosyasına ihracat bir PowerShell betiği var ve dosyadaki başlık bilgilerini atlar.

add-pssnapin sqlserverprovidersnapin100
add-pssnapin sqlservercmdletsnapin100

$qry = @"
Select
  *
From
 tablename
"@

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $qry | convertto-CSV -notype | select -skip 1  > "full path and filename.csv"

İlk iki satır Invoke-SqlCmd komut-let komutunu kullanma olanağını sağlar .


6

T-SQL kullanın :

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

Ancak, birkaç uyarı var:

  1. Microsoft.ACE.OLEDB.12.0 sağlayıcısının kullanılabilir olması gerekir. Jet 4.0 sağlayıcısı da çalışacak, ancak eski, bu yüzden bunu kullandım.

  2. .CSV dosyasının zaten mevcut olması gerekir. Headers ( HDR=YES) kullanıyorsanız , .CSV dosyasının ilk satırının tüm alanların ayrılmış bir listesi olduğundan emin olun.


3

SSMS değerleri çift tırnak işaretleri arasına almadığından, değerleriniz virgül içeriyorsa CSV'ye dışa aktarmak için yerel SQL Server Management Studio tekniğini kullanmak (@ 8kb önerilir) çalışmaz. Benim için çalışan daha sağlam bir yol, sonuçları kopyalamak (ızgarayı tıklatıp ardından CTRL-A, CTRL-C) ve Excel'e yapıştırmaktır. Ardından Excel'den CSV dosyası olarak kaydedin.


2

QueryToDoc'u kullanabilirsiniz ( http://www.querytodoc.com ). SQL veritabanına bir sorgu yazmanıza ve sonuçları (sınırlayıcıyı seçtikten sonra) Excel, Word, HTML veya CSV'ye dışa aktarmanıza olanak tanır


2
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

@Slogmeister Extraordinaire Alıntı olarak doğru.

1> Dosya zaten sütun 2 ile mevcut olması gerekir> Bir Office yüklü olması gerekir

Karşılaşılan hatalar

1

Msg 7303, Seviye 16, Durum 1, Satır 1 OLE DB sağlayıcısının "Microsoft.ACE.OLEDB.12.0" veri kaynağı nesnesi bağlı sunucu "(null)" için başlatılamıyor. "

64 bit http://download.microsoft.com/download/2/4/3/24375141-E08D-4803-AB0E-10F2E3A07AAA/AccessDatabaseEngine_x64.exe

32 bit http://download.microsoft.com/download/f/d/8/fd8c20d8-e38a-48b6-8691-542403b91da1/AccessDatabaseEngine.exe

2

Msg 15281, Düzey 16, Durum 1, Satır 1 SQL Server, 'Ad Hoc Dağıtılmış Sorgular' bileşeninin STATEMENT 'OpenRowset / OpenDatasource' erişimini engelledi, çünkü bu bileşen bu sunucunun güvenlik yapılandırmasının bir parçası olarak kapatıldı. Bir sistem yöneticisi sp_configure kullanarak 'Ad Hoc Dağıtılmış Sorgular' kullanımını etkinleştirebilir. 'Ad Hoc Dağıtılmış Sorguları' özelliğini etkinleştirme hakkında daha fazla bilgi için SQL Server Books Online'da 'Ad Hoc Dağıtılmış Sorguları' için arama yapın.

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO

2

Powershell'i kullanmak istemiyorsanız, bu cevap 8kb'nin harika cevabının bir çeşididir. Tek fark çıktı formatı olarak CSV'yi seçmek yerine Sekmeyle Sınırlandırılmış'ı seçmektir. Bu şekilde verilerinizde virgül varsa, Excel'deki hücreleri atlamaz. Ayrıca, Excel'in varsayılan sınırlayıcısını sekmelere ayarladıysanız, SSMS sorgu sonuçlarının tümünü (CTRL-A, CTRL-C) bir kopyasını yapabilir ve Excel'e yapıştırabilirsiniz (dosya olarak kaydetmenize ve Excel'e aktarmanıza gerek yoktur) ):

  • SSMS'de Araçlar> Seçenekler> Sorgu Sonuçları> SQL Server> Metne İlişkin Sonuçlar'a gidin
  • En sağdaki çıktı biçimini Sekmeyle Sınırlandırılmış olarak değiştirin
  • Tamam'ı tıklayın

Şimdi sorgunuzu yürütebilir, ardından tüm sonuçları seçmek için CTRL-A, ardından panoya kopyalamak için CTRL-C yapın, sonra Excel 2013'e geçin (2007'de de çalışabilir, emin değilim) ve yapıştırın - Excel'in varsayılanını varsayarak sınırlayıcı sekmeye ayarlanmıştır.

SSMS Sorgu Seçenekleri Ekranı resmi


-1

Evet, tüm bunlar sunuculara doğrudan erişiminiz olduğunda mümkündür. Ancak sunucuya yalnızca bir web / uygulama sunucusundan erişiminiz varsa ne olur? Peki, bu durum uzun zamandır bizimle birlikte ve çözüm CSV'ye SQL Server Export oldu .


Bağlantı ... Erişim reddedildi mi?
hoggar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.