С 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 module , который изменит текущий каталог на 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 class.