Với PowerShell, bạn có thể giải quyết vấn đề một cách gọn gàng bằng cách chuyển Invoke-Sqlcmd vào Export-Csv.
#Requires -Module SqlServer
Invoke-Sqlcmd -Query "SELECT * FROM DimDate;" `
-Database AdventureWorksDW2012 `
-Server localhost |
Export-Csv -NoTypeInformation `
-Path "DimDate.csv" `
-Encoding UTF8
SQL Server 2016 bao gồm mô-đun SqlServer chứa Invoke-Sqlcmd
cmdlet, bạn sẽ có ngay cả khi bạn chỉ cài đặt SSMS 2016. Trước đó, SQL Server 2012 đã bao gồm mô-đun SQLPS cũ , sẽ thay đổi thư mục hiện tại thành SQLSERVER:\
khi mô-đun lần đầu tiên được sử dụng (trong số các lỗi khác), vì vậy, bạn cần thay đổi #Requires
dòng trên thành:
Push-Location $PWD
Import-Module -Name SQLPS
# dummy query to catch initial surprise directory change
Invoke-Sqlcmd -Query "SELECT 1" `
-Database AdventureWorksDW2012 `
-Server localhost |Out-Null
Pop-Location
# actual Invoke-Sqlcmd |Export-Csv pipeline
Để điều chỉnh ví dụ cho SQL Server 2008 và 2008 R2, hãy xóa #Requires
hoàn toàn dòng và sử dụng tiện ích sqlps.exe thay vì máy chủ PowerShell tiêu chuẩn.
Invoke-Sqlcmd là PowerShell tương đương với sqlcmd.exe. Thay vì văn bản, nó xuất ra các đối tượng System.Data.DataRow .
Các -Query
thông số hoạt động như -Q
tham số của sqlcmd.exe. Truyền cho nó một truy vấn SQL mô tả dữ liệu bạn muốn xuất.
Các -Database
thông số hoạt động như -d
tham số của sqlcmd.exe. Truyền cho nó tên của cơ sở dữ liệu chứa dữ liệu sẽ được xuất.
Các -Server
thông số hoạt động như -S
tham số của sqlcmd.exe. Truyền cho nó tên của máy chủ chứa dữ liệu sẽ được xuất.
Xuất-CSV là một lệnh ghép ngắn PowerShell nối tiếp các đối tượng chung thành CSV. Nó xuất xưởng với PowerShell.
Các -NoTypeInformation
tham số ngăn chặn thêm đầu ra đó không phải là một phần của định dạng CSV. Theo mặc định, lệnh ghép ngắn viết một tiêu đề với thông tin loại. Nó cho phép bạn biết loại đối tượng khi bạn giải tuần tự hóa nó sau này Import-Csv
, nhưng nó gây nhầm lẫn các công cụ mong đợi CSV tiêu chuẩn.
Các -Path
thông số hoạt động như -o
tham số của sqlcmd.exe. Đường dẫn đầy đủ cho giá trị này là an toàn nhất nếu bạn bị mắc kẹt khi sử dụng mô-đun SQLPS cũ .
Các -Encoding
thông số hoạt động như -f
hoặc -u
tham số của sqlcmd.exe. Theo mặc định, Export-Csv chỉ xuất các ký tự ASCII và thay thế tất cả các ký tự khác bằng dấu chấm hỏi. Thay vào đó, hãy sử dụng UTF8 để bảo toàn tất cả các ký tự và luôn tương thích với hầu hết các công cụ khác.
Ưu điểm chính của giải pháp này so với sqlcmd.exe hoặc bcp.exe là bạn không phải hack lệnh để xuất CSV hợp lệ. Lệnh ghép ngắn Xuất-Csv xử lý tất cả cho bạn.
Nhược điểm chính là Invoke-Sqlcmd
đọc toàn bộ kết quả trước khi đưa nó dọc theo đường ống. Đảm bảo bạn có đủ bộ nhớ cho toàn bộ tập kết quả bạn muốn xuất.
Nó có thể không hoạt động trơn tru cho hàng tỷ hàng. Nếu đó là một vấn đề, bạn có thể thử các công cụ khác hoặc cuộn phiên bản hiệu quả của riêng bạn Invoke-Sqlcmd
bằng cách sử dụng lớp System.Data.SqlClient.SqlDataReader .