Xuất kết quả truy vấn sang tệp .csv trong SQL Server 2008


141

Làm cách nào tôi có thể xuất kết quả truy vấn sang tệp .csv trong SQL Server 2008?



Bạn có cần dấu phân cách của bạn thoát? Hầu hết các câu trả lời cho đến nay đều cho rằng bạn không, đó thực sự không phải là CSV.
Nick

@Nick - nói chung các dấu phân cách chỉ được chứa trong một chuỗi và chúng thường có dấu ngoặc kép quanh chúng. Xem câu trả lời của tôi để xem giải pháp cho việc này. stackoverflow.com/questions/6115054/ cường
MacGyver


Thỉnh thoảng tôi sử dụng Python
LV98

Câu trả lời:


168
  1. Mở SQL Management Management Studio
  2. Chuyển đến Công cụ> Tùy chọn> Kết quả truy vấn> Máy chủ SQL> Kết quả thành văn bản
  3. Ở phía bên phải, có một hộp thả xuống được gọi là Định dạng đầu ra
  4. Chọn Dấu phẩy được phân cách và nhấp vào OK

Đây là phiên bản toàn màn hình của hình ảnh đó, bên dưới

nhập mô tả hình ảnh ở đây

Điều này sẽ hiển thị kết quả truy vấn của bạn dưới dạng văn bản được phân cách bằng dấu phẩy.

Để lưu kết quả của truy vấn vào một tệp: Ctrl + Shift + F


10
Câu trả lời hơi sai lệch ... Khi bạn nhấn Ctrl+Shift+F, nó chỉ thay đổi chế độ đầu ra, nó không ảnh hưởng đến kết quả nếu bạn đã chạy truy vấn. Để điều này được phản ánh, bạn phải chạy lại truy vấn. Khi bạn chạy nó trong chế độ "Kết quả thành tệp", nó sẽ nhắc bạn về nơi bạn muốn lưu kết quả.
qJake

3
Nên vào Công cụ> Tùy chọn> Kết quả truy vấn> Máy chủ SQL > Kết quả thành văn bản
congusbongus

45
Chạy lại truy vấn không đủ cho tôi. Tôi đã phải đóng cửa sổ truy vấn, mở một cái mới và sau đó chạy lại truy vấn.
Breandán

3
Xác nhận @ Breandán bình luận. Các cài đặt mới sẽ không áp dụng cho cửa sổ truy vấn hiện đang mở, phải đóng chúng và chạy lại truy vấn.
Shinigamae

3
Một điều tôi phải làm là xuất nó dưới dạng phần mở rộng RPT mặc định. Sau khi làm điều đó, bạn có thể chỉ cần đổi tên nó thành CSV và nó hoạt động.
Thomas Bennett

140

Tôi biết điều này hơi cũ, nhưng đây là một cách dễ dàng hơn nhiều ...

  1. Chạy truy vấn của bạn với cài đặt mặc định (đặt kết quả ở định dạng lưới, nếu của bạn không ở định dạng lưới, xem bên dưới)

  2. Nhấp chuột phải vào kết quả lưới và nhấp vào "Lưu kết quả dưới dạng" và lưu nó.

Nếu kết quả của bạn không ở định dạng lưới, nhấp chuột phải vào nơi bạn viết truy vấn, di chuột "Kết quả đến" và nhấp vào "Kết quả vào lưới"

Hãy lưu ý rằng bạn KHÔNG chụp các tiêu đề cột!

Chúc may mắn!


1
Vấn đề duy nhất là phương pháp này dường như không cho phép bạn đặt bất kỳ tùy chọn nào. Ví dụ: tất cả các NULL hiển thị trong các tệp đầu ra là "NULL", v.v. Tuy nhiên, có lẽ có một cách để đặt cái này mà tôi không biết.

13
Thật đáng ngạc nhiên ngay cả trong SSMS 2012, điều này không trích dẫn đúng văn bản cho CSV. Một dấu phẩy hoặc dòng mới trong CHAR / VARCHAR nên được trích dẫn, nhưng không phải. Điều đó khiến dữ liệu chuyển sang các cột mới hoặc vào một dòng mới.
Eric J.

4
Cũng không cung cấp cho bạn tiêu đề cột.
Don

8
@Don này sẽ cung cấp các tiêu đề cột nếu bạn đi vào "Truy vấn" -> "Tùy chọn truy vấn ...", tab lưới và kiểm tra "bao gồm các tiêu đề cột khi sao chép hoặc lưu kết quả"
Rob Wise

7
Đây nên là câu trả lời.
pspahn

46

Bạn có thể sử dụng PowerShell

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

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

Cảm ơn bạn! Đây là đề nghị duy nhất làm việc cho tôi. Xử lý thoát đúng cách
emertechie

3
+10 nếu tôi có thể. Chỉ trả lời mà xử lý thoát. Để có được điều này để chạy, tôi đã phải thêm hai dòng ở đầu tập lệnh: Add-PSSnapin SqlServerCmdletSnapin100Add-PSSnapin SqlServerProviderSnapin100.
Eric J.

nếu bạn phải đối mặt với thời gian chờ thêm querytimeout nên ví dụInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

1
Là người mới sử dụng Powershell, tôi cần cài đặt Mô-đun SqlServer: Install-Module -Name SqlServer(nhưng không cần phải cài vào các Cmdlets đó). Ngoài ra, tôi đã lưu các lệnh trong một tập lệnh, sẽ không chạy cho đến khi tôi thay đổi chính sách thực thi : Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser.
tòa nhà cát

@sandyscott Tôi cũng là người mới chơi Powershell, cảm ơn bạn rất nhiều. Dù sao, tôi nghĩ rằng trong trường hợp này, một RemoteSignedchính sách thực thi sẽ đủ.
BigBother

14

Nếu cơ sở dữ liệu được đề cập là cục bộ, thì đây có lẽ là cách mạnh mẽ nhất để xuất kết quả truy vấn sang tệp CSV (nghĩa là cung cấp cho bạn quyền kiểm soát nhiều nhất).

  1. Sao chép truy vấn.
  2. Trong Object Explorer, nhấp chuột phải vào cơ sở dữ liệu được đề cập.
  3. Chọn "Nhiệm vụ" >> "Xuất dữ liệu ..."
  4. Định cấu hình nguồn dữ liệu của bạn và nhấp vào "Tiếp theo".
  5. Chọn "Tệp phẳng" hoặc "Microsoft Excel" làm đích.
  6. Chỉ định đường dẫn tệp.
  7. Nếu làm việc với một tệp phẳng, cấu hình như mong muốn. Nếu làm việc với Microsoft Excel, chọn "Excel 2007" (các phiên bản trước có giới hạn hàng ở mức 64k)
  8. Chọn "Viết truy vấn để chỉ định dữ liệu cần truyền"
  9. Dán truy vấn từ Bước 1.
  10. Nhấp vào tiếp theo >> xem lại ánh xạ >> nhấp vào tiếp theo >> chọn "chạy ngay" >> nhấp vào "kết thúc" hai lần.

Sau khi trải qua quá trình này một cách triệt để, tôi thấy sau đây là lựa chọn tốt nhất

Tập lệnh PowerShell

$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

Chạy PowerShell với tư cách quản trị viên

& "c:\path_to_your_ps1_file.ps1"

1
nếu bạn phải đối mặt với thời gian chờ thêm querytimeout nên ví dụInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

6

MS Excel -> Dữ liệu -> Truy vấn mới -> Từ cơ sở dữ liệu .. thực hiện theo các bước


6

Dựa trên câu trả lời của NS, tôi có tập lệnh PowerShell xuất sang tệp CSV có dấu ngoặc kép quanh trường và được phân tách bằng dấu phẩy và nó bỏ qua thông tin tiêu đề trong tệp.

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"

Hai dòng đầu tiên cho phép khả năng sử dụng lệnh Invoke-SqlCmd .


6

Sử dụng 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

Nhưng, có một vài cảnh báo:

  1. Bạn cần phải có nhà cung cấp Microsoft.ACE.OLEDB.12.0. Nhà cung cấp Jet 4.0 cũng sẽ hoạt động, nhưng nó đã cũ, vì vậy tôi đã sử dụng cái này thay thế.

  2. Tệp .CSV sẽ phải tồn tại. Nếu bạn đang sử dụng các tiêu đề ( HDR=YES), hãy đảm bảo dòng đầu tiên của tệp .CSV là danh sách được phân tách của tất cả các trường.


3

Sử dụng kỹ thuật SQL Server Management Studio để xuất sang CSV (như @ 8kb đã đề xuất) sẽ không hoạt động nếu giá trị của bạn chứa dấu phẩy, vì SSMS không bao bọc các giá trị trong dấu ngoặc kép. Một cách hiệu quả hơn đối với tôi là chỉ cần sao chép kết quả (nhấp vào bên trong lưới và sau đó là CTRL-A, CTRL-C) và dán nó vào Excel. Sau đó lưu dưới dạng tệp CSV từ Excel.


2

Bạn có thể sử dụng QueryToDoc ( http://www.querytodoc.com ). Nó cho phép bạn viết một truy vấn đối với cơ sở dữ liệu SQL và xuất kết quả - sau khi bạn chọn dấu phân cách - sang Excel, Word, HTML hoặc CSV


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

như @Slogmeister Extraordinaire Trích dẫn là chính xác.

Một cần phải có 1> Tệp đã có sẵn với các cột 2> Một cần phải cài đặt Office

Lỗi phải đối mặt

1

Msg 7303, Cấp 16, Trạng thái 1, Dòng 1 Không thể khởi tạo đối tượng nguồn dữ liệu của nhà cung cấp OLE DB "Microsoft.ACE.OLEDB.12.0" cho máy chủ được liên kết "(null)". "

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

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

2

Msg 15281, Cấp 16, Trạng thái 1, Máy chủ SQL Dòng 1 đã chặn quyền truy cập vào TÌNH TRẠNG 'OpenRowset / OpenDatasource' của thành phần 'Truy vấn phân phối quảng cáo' vì thành phần này bị tắt như một phần của cấu hình bảo mật cho máy chủ này. Quản trị viên hệ thống có thể cho phép sử dụng 'Truy vấn phân phối quảng cáo' bằng cách sử dụng sp_cool. Để biết thêm thông tin về việc bật 'Truy vấn phân phối Ad Hoc', hãy tìm kiếm 'Truy vấn phân tán Ad Hoc' trong Sách dành cho máy chủ SQL trực tuyến.

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

2

Nếu bạn không muốn sử dụng Powershell, câu trả lời này là một biến thể của câu trả lời tuyệt vời của 8kb. Sự khác biệt duy nhất là thay vì chọn CSV làm định dạng đầu ra, hãy chọn Phân cách tab. Bằng cách này nếu có dấu phẩy trong dữ liệu của bạn, nó sẽ không bỏ qua các ô trong Excel. Ngoài ra, nếu bạn đã đặt dấu phân cách mặc định của Excel thành các tab, bạn chỉ cần sao chép tất cả các kết quả truy vấn SSMS (CTRL-A, CTRL-C) và dán vào Excel (không cần lưu dưới dạng tệp và nhập vào Excel ):

  • Trong SSMS Chuyển đến Công cụ> Tùy chọn> Kết quả truy vấn> Máy chủ SQL> Kết quả thành văn bản
  • Thay đổi định dạng đầu ra ở bên phải sang Tab Deliated
  • Nhấn vào OK

Bây giờ bạn có thể thực hiện truy vấn của mình, sau đó thực hiện CTRL-A để chọn tất cả các kết quả, sau đó CTRL-C để sao chép vào bảng tạm, sau đó chuyển sang Excel 2013 (cũng có thể hoạt động vào năm 2007) và dán - giả sử mặc định của Excel dấu phân cách được đặt thành tab.

Hình ảnh của màn hình tùy chọn truy vấn SSMS


-1

Có, tất cả những điều này là có thể khi bạn có quyền truy cập trực tiếp vào máy chủ. Nhưng nếu bạn chỉ có quyền truy cập vào máy chủ từ máy chủ web / ứng dụng thì sao? Vâng, tình hình đã xảy ra với chúng tôi từ lâu và giải pháp là SQL Server Xuất sang CSV .


Liên kết ... Truy cập bị từ chối?
hoggar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.