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