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-Sqlcmdcmdlet, 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ć #Requirespowyż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ń #Requirescał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 .
-QueryParametr działa jak -Qparametr sqlcmd.exe. Przekaż mu zapytanie SQL opisujące dane, które chcesz wyeksportować.
-DatabaseParametr działa jak -dparametr sqlcmd.exe. Podaj nazwę bazy danych zawierającej dane do wyeksportowania.
-ServerParametr działa jak -Sparametr 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 -NoTypeInformationparametr 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.
-PathParametr działa jak -oparametr sqlcmd.exe. Pełna ścieżka dla tej wartości jest najbezpieczniejsza, jeśli utkniesz przy użyciu starego modułu SQLPS .
-EncodingParametr działa jak -flub -uparametró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-Sqlcmdczyta 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-Sqlcmdużywając System.Data.SqlClient.SqlDataReader klasę.