За допомогою 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 .