Com o PowerShell, você pode resolver o problema perfeitamente, canalizando Invoke-Sqlcmd para Export-Csv.
#Requires -Module SqlServer
Invoke-Sqlcmd -Query "SELECT * FROM DimDate;" `
-Database AdventureWorksDW2012 `
-Server localhost |
Export-Csv -NoTypeInformation `
-Path "DimDate.csv" `
-Encoding UTF8
O SQL Server 2016 inclui o módulo SqlServer , que contém o Invoke-Sqlcmd
cmdlet, que você terá mesmo se instalar o SSMS 2016. Antes disso, o SQL Server 2012 incluía o antigo módulo SQLPS , que alteraria o diretório atual para SQLSERVER:\
quando o módulo fosse usado pela primeira vez (entre outros bugs), portanto, para isso, você precisará alterar a #Requires
linha acima para:
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
Para adaptar o exemplo ao SQL Server 2008 e 2008 R2, remova #Requires
completamente a linha e use o utilitário sqlps.exe em vez do host padrão do PowerShell.
Invoke-Sqlcmd é o equivalente do PowerShell ao sqlcmd.exe. Em vez de texto, ele gera objetos System.Data.DataRow .
O -Query
parâmetro funciona como o -Q
parâmetro sqlcmd.exe. Passe uma consulta SQL que descreva os dados que você deseja exportar.
O -Database
parâmetro funciona como o -d
parâmetro sqlcmd.exe. Passe o nome do banco de dados que contém os dados a serem exportados.
O -Server
parâmetro funciona como o -S
parâmetro sqlcmd.exe. Passe o nome do servidor que contém os dados a serem exportados.
Export-CSV é um cmdlet do PowerShell que serializa objetos genéricos em CSV. É fornecido com o PowerShell.
O -NoTypeInformation
parâmetro suprime a saída extra que não faz parte do formato CSV. Por padrão, o cmdlet grava um cabeçalho com informações de tipo. Ele permite que você saiba o tipo do objeto ao desserializá-lo posteriormente Import-Csv
, mas confunde ferramentas que esperam um CSV padrão.
O -Path
parâmetro funciona como o -o
parâmetro sqlcmd.exe. Um caminho completo para esse valor é mais seguro se você estiver preso usando o antigo módulo SQLPS .
O -Encoding
parâmetro funciona como os parâmetros -f
ou -u
do sqlcmd.exe. Por padrão, Export-Csv gera apenas caracteres ASCII e substitui todos os outros por pontos de interrogação. Use UTF8 para preservar todos os caracteres e permanecer compatível com a maioria das outras ferramentas.
A principal vantagem dessa solução sobre o sqlcmd.exe ou o bcp.exe é que você não precisa hackear o comando para gerar um CSV válido. O cmdlet Export-Csv lida com tudo isso para você.
A principal desvantagem é que Invoke-Sqlcmd
lê todo o conjunto de resultados antes de transmiti-lo ao longo do pipeline. Verifique se você possui memória suficiente para todo o conjunto de resultados que deseja exportar.
Pode não funcionar sem problemas por bilhões de linhas. Se isso for um problema, você pode tentar as outras ferramentas ou implementar sua própria versão eficiente do Invoke-Sqlcmd
uso da classe System.Data.SqlClient.SqlDataReader .