С PowerShell вы можете аккуратно решить эту проблему, отправив Invoke-Sqlcmd в 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 включает в себя модуль SqlServer , который содержит Invoke-Sqlcmd
командлет, который у вас будет, даже если вы просто установите SSMS 2016. До этого SQL Server 2012 включал старый модуль SQLPS , который изменял текущий каталог на тот момент, SQLSERVER:\
когда модуль был впервые используется (среди прочих ошибок), поэтому для этого вам нужно изменить #Requires
строку выше:
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
Чтобы адаптировать пример для SQL Server 2008 и 2008 R2, полностью удалите #Requires
строку и используйте утилиту sqlps.exe вместо стандартного хоста PowerShell.
Invoke-Sqlcmd является PowerShell-эквивалентом sqlcmd.exe. Вместо текста он выводит объекты System.Data.DataRow .
-Query
Параметр работает как -Q
параметр sqlcmd.exe. Передайте ему запрос SQL, который описывает данные, которые вы хотите экспортировать.
-Database
Параметр работает как -d
параметр sqlcmd.exe. Передайте ему имя базы данных, которая содержит данные для экспорта.
-Server
Параметр работает как -S
параметр sqlcmd.exe. Передайте ему имя сервера, который содержит данные для экспорта.
Export-CSV - это командлет PowerShell, который сериализует общие объекты в CSV. Поставляется с PowerShell.
-NoTypeInformation
Параметр подавляет дополнительный выход , который не является частью формата CSV. По умолчанию командлет записывает заголовок с информацией о типе. Он позволяет вам узнать тип объекта при последующей десериализации Import-Csv
, но это сбивает с толку инструменты, которые ожидают стандартного CSV.
-Path
Параметр работает как -o
параметр sqlcmd.exe. Полный путь к этому значению наиболее безопасен, если вы застряли, используя старый модуль SQLPS .
-Encoding
Параметр работает как -f
и -u
параметры sqlcmd.exe. По умолчанию Export-Csv выводит только символы ASCII и заменяет все остальные знаками вопроса. Вместо этого используйте UTF8, чтобы сохранить все символы и оставаться совместимым с большинством других инструментов.
Основное преимущество этого решения перед sqlcmd.exe или bcp.exe заключается в том, что вам не нужно взламывать команду для вывода действительного CSV. Командлет Export-Csv обрабатывает все это за вас.
Основным недостатком является то, что Invoke-Sqlcmd
читает весь набор результатов, прежде чем передать его по конвейеру. Убедитесь, что у вас достаточно памяти для всего набора результатов, который вы хотите экспортировать.
Это может не работать гладко для миллиардов строк. Если это проблема, вы можете попробовать другие инструменты, или свернуть свой собственный эффективный вариант Invoke-Sqlcmd
использования System.Data.SqlClient.SqlDataReader класса.