Za pomocą PowerShell można starannie rozwiązać problem, przesyłając Invoke-Sqlcmd do 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 zawiera moduł SqlServer , który zawiera polecenie Invoke-Sqlcmd
cmdlet, które będziesz mieć nawet po zainstalowaniu programu SSMS 2016. Wcześniej SQL Server 2012 zawierał stary moduł SQLPS , który zmienił bieżący katalog na ten, w SQLSERVER:\
którym moduł był jako pierwszy używany (wśród innych błędów), więc w tym celu musisz zmienić #Requires
powyższy wiersz na:
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
Aby dostosować przykład do SQL Server 2008 i 2008 R2, usuń #Requires
całkowicie linię i użyj narzędzia sqlps.exe zamiast standardowego hosta PowerShell.
Invoke-Sqlcmd jest odpowiednikiem programu PowerShell dla sqlcmd.exe. Zamiast tekstu generuje obiekty System.Data.DataRow .
-Query
Parametr działa jak -Q
parametr sqlcmd.exe. Przekaż mu zapytanie SQL opisujące dane, które chcesz wyeksportować.
-Database
Parametr działa jak -d
parametr sqlcmd.exe. Podaj nazwę bazy danych zawierającej dane do wyeksportowania.
-Server
Parametr działa jak -S
parametr sqlcmd.exe. Podaj nazwę serwera zawierającego dane do wyeksportowania.
Export-CSV to polecenie cmdlet programu PowerShell, które serializuje obiekty ogólne do CSV. Jest dostarczany z PowerShell.
Ten -NoTypeInformation
parametr pomija dodatkowe dane wyjściowe, które nie są częścią formatu CSV. Domyślnie cmdlet zapisuje nagłówek z informacjami o typie. Pozwala poznać typ obiektu podczas późniejszej deserializacji Import-Csv
, ale myli narzędzia, które oczekują standardowego pliku CSV.
-Path
Parametr działa jak -o
parametr sqlcmd.exe. Pełna ścieżka dla tej wartości jest najbezpieczniejsza, jeśli utkniesz przy użyciu starego modułu SQLPS .
-Encoding
Parametr działa jak -f
lub -u
parametrów sqlcmd.exe. Domyślnie Export-Csv generuje tylko znaki ASCII i zastępuje wszystkie inne znakami zapytania. Zamiast tego użyj UTF8, aby zachować wszystkie znaki i zachować zgodność z większością innych narzędzi.
Główną zaletą tego rozwiązania w porównaniu z programem sqlcmd.exe lub bcp.exe jest to, że nie trzeba hakować polecenia, aby wyświetlić prawidłowy plik CSV. Polecenie cmdlet Export-Csv obsługuje to wszystko za Ciebie.
Główną wadą jest to, że Invoke-Sqlcmd
czyta cały zestaw wyników przed przekazaniem go w potoku. Upewnij się, że masz wystarczająco dużo pamięci na cały zestaw wyników, który chcesz wyeksportować.
Może nie działać płynnie dla miliardów wierszy. Jeśli to jest problem, można spróbować innych narzędzi, lub toczyć własną wydajną wersję Invoke-Sqlcmd
używając System.Data.SqlClient.SqlDataReader klasę.