Eu posso facilmente despejar dados em um arquivo de texto, como:
sqlcmd -S myServer -d myDB -E -Q "select col1, col2, col3 from SomeTable"
-o "MyData.txt"
No entanto, observei os arquivos de ajuda, SQLCMD
mas não vi uma opção específica para CSV.
Existe uma maneira de despejar dados de uma tabela em um arquivo de texto CSV usando SQLCMD
?
sql-server
file
csv
sqlcmd
Raio
fonte
fonte
Respostas:
Você pode executar algo parecido com isto:
-h-1
remove os cabeçalhos do nome da coluna do resultado-s","
define o separador de coluna como,-w 700
define a largura da linha para 700 caracteres (isso precisará ser tão largo quanto a linha mais longa ou será agrupado na próxima linha)fonte
'""' + col1 + '""' AS col1
aspas duplas (dobradas) ou simplesmente chamar um procedimento armazenado.Com o PowerShell, você pode resolver o problema perfeitamente, canalizando Invoke-Sqlcmd para Export-Csv.
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 paraSQLSERVER:\
quando o módulo fosse usado pela primeira vez (entre outros bugs), portanto, para isso, você precisará alterar a#Requires
linha acima para: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 posteriormenteImport-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 .fonte
A última linha contém opções específicas para CSV.
-W
remover espaços à direita de cada campo individual-s","
define o separador de coluna como vírgula (,)-w 999
define a largura da linha para 999 caracteresA resposta da scottm está muito próxima do que eu uso, mas acho
-W
que é uma adição muito boa: não preciso aparar espaços em branco quando consumir o CSV em outro lugar.Consulte também a referência sqlcmd do MSDN . Isso
/?
envergonha a saída da opção.fonte
'""' + col1 + '""' AS col1
aspas duplas (dobradas) ou apenas chamar um procedimento armazenado.Isso não
bcp
foi feito para isso?Execute isso na sua linha de comando para verificar a sintaxe.
Por exemplo:
Observe que
bcp
não é possível gerar cabeçalhos de coluna.Consulte: página de documentos do utilitário bcp .
Exemplo da página acima:
fonte
bcp
não inclui o cabeçalho (nomes das colunas), mas é 10 vezes mais rápido do quesqlcmd
(pela minha experiência). Para dados realmente grandes, você pode usarbcp
para obtê- los e usarsqlcmd
(selecione 0 * superior de ...) para obter o cabeçalho e combiná-los.Uma observação para quem quer fazer isso, mas também possui os cabeçalhos das colunas, esta é a solução que usei um arquivo em lotes:
Isso gera os resultados iniciais (incluindo os separadores ----, ---- entre os cabeçalhos e os dados) em um arquivo temporário e remove a linha, filtrando-a através de findstr. Observe que não é perfeito, pois está filtrando
-,-
- não funcionará se houver apenas uma coluna na saída e também filtrará as linhas legítimas que contêm essa string.fonte
Esta resposta baseia-se na solução do @ iain-elder, que funciona bem, exceto no caso de banco de dados grande (como apontado em sua solução). A tabela inteira precisa caber na memória do seu sistema, e para mim isso não era uma opção. Eu suspeito que a melhor solução usaria o System.Data.SqlClient.SqlDataReader e um serializador CSV personalizado ( veja aqui um exemplo ) ou outro idioma com um driver MS SQL e serialização CSV. No espírito da pergunta original, que provavelmente estava procurando uma solução sem dependência, o código do PowerShell abaixo funcionou para mim. É muito lento e ineficiente, especialmente em instanciar o array de dados $ e chamar Export-Csv no modo de acréscimo para cada linha de tamanho $ chunk_size.
fonte
Opção alternativa com BCP:
fonte
Geralmente
sqlcmd
vem com obcp
utilitário (como parte demssql-tools
) que exporta para CSV por padrão.Uso:
Por exemplo:
Para despejar todas as tabelas nos arquivos CSV correspondentes, aqui está o script Bash :
fonte
Uma resposta acima quase o resolveu para mim, mas não cria corretamente um CSV analisado.
Aqui está a minha versão:
Alguém dizendo que
sqlcmd
está desatualizado em favor de alguma alternativa do PowerShell está esquecendo quesqlcmd
não é apenas para o Windows. Estou no Linux (e quando no Windows evito PS de qualquer maneira).Dito tudo isso, acho
bcp
mais fácil.fonte
Desde os 2 motivos a seguir, você deve executar minha solução no CMD:
Às vezes, é necessário o nome de usuário e senha de login para consultar uma instância remota do SQL Server
fonte
Você pode fazer isso de uma maneira hackeada. Cuidado usando o
sqlcmd
hack. Se os dados tiverem aspas ou vírgulas, você terá problemas.Você pode usar um script simples para fazer isso corretamente:
Fonte: Gravando saída SQL em CSV com VBScript .
fonte
sqlcmd
, estávamos apenas declarando o fato de quesqlcmd
não está escapando adequadamente da vírgula, dificilmente sendo útil para qualquer saída séria de CSV.