Consigo exportar os resultados do procedimento armazenado como CSV para a unidade local no SQL Server, mas estou com dificuldade para exportar os resultados para um servidor externo (ou local de unidade compartilhada).
Só consigo usar BCP
o comando do prompt de comando, mas ele tem funcionalidade limitada. Além disso, o BCP
comando exporta apenas ASCII. Quero exportar como formato UTF-8 BOM.
Implementei os seguintes métodos para exportar os resultados como csv:
O sp_configure 'xp_cmdshell'
já está ligado
Use
BCP
o comando do SQL Server:declare @sql varchar(8000) select @sql = 'BCP "EXEC [dbName].[dbo].[StoredProcedureName] @AreaID=NULL" queryout "\\serverlocation\Test\FileExport_Test_1.CSV"-T -S SourceServerName -c -t,' exec master..xp_cmdshell @sql
Este comando está exportando csv ao exportar para o local do servidor
Recebo este erro quando executo o comando acima:
Erro = [Microsoft][SQL Server Native Client 11.0]Não é possível abrir o arquivo de dados do host BCP
Use o comando BCP no prompt de comando.
C:\Windows\System32>BCP "EXEC [dbName].[dbo].[StoredProcedureName] @AreaID=NULL" queryout "\\serverlocation\Test\FileExport_Test_1.CSV"-T -S SourceServerName -c -t
O arquivo é exportado para o local do servidor externo, mas não quero usar esse método porque quero usar um nome de arquivo dinâmico e passar valores de parâmetros dinâmicos para o procedimento armazenado.
Usar o Powershell:
PS SQLSERVER:\> $filename = "\\serverlocation\Test\FileExport_Test_1" Invoke-Sqlcmd -Query "EXEC [dbName].[dbo].[StoredProcedureName] @AreaID=NULL" -ServerInstance "SourceServerName" | Export-Csv -Path "$filename.csv" -NoTypeInformation
Recebo o seguinte erro:
Export-Csv: Não é possível abrir o arquivo porque o provedor atual (Microsoft.SqlServer.Management.PSProvider\SqlServer) não pode abrir um arquivo.
Na linha:3 char:1- Export-Csv -Caminho "$filename.csv" -NoTypeInformation
-
- CategoryInfo: Argumento inválido: (:) [Export-Csv], PSInvalidOperationException
- FullyQualifiedErrorId: ReadWriteFileNotFileSystemProvider, Microsoft.PowerShell.Commands.ExportCsvCommand
Exporte o CSV do SSRS como Windows Share. Mas o CSV está adicionando aspas duplas em torno de um campo que tem aspas. Então, não é possível usar esse método para exportar CSV
Não estou muito familiarizado com o SSIS e aprender SSIS levará algum tempo e tenho que fornecer a solução em um prazo muito curto. :(
Por favor ajude
Re 2 (use from
cmd.exe
, também conhecido como Prompt de Comando):De forma análoga à sua tentativa de solução do PowerShell, você pode definir uma
cmd.exe
variável que pode ser referenciada em seu comando, colocando o nome da variável entre%...%
:Observação : na ausência de um
-C
argumento , a codificação de caracteres usada para escrever o arquivo de saída é implícita na página de código da janela do console atual, conforme refletido[Console]::OutputEncoding
no PowerShell; essa página de código assume como padrão a página de código OEM da localidade do sistema legado, como CP437 em sistemas em inglês dos EUA.-C 65001
isso resultasse em codificação UTF-8 , não incluiria um BOM .Re 3 (uso
Invoke-SqlCmd
do PowerShell):Seu único problema é que você está invocando seu comando enquanto o local atual está definido como
SQLSERVER:\
, o que impede que você use um caminho UNC como está , porque ele é - talvez surpreendentemente - interpretado como um caminho relativo , ou seja, relativo ao provedor subjacente ao local atual. [1]A solução mais simples é usar um prefixo de provedor antes do seu caminho UNC, ou seja, o do
FileSystem
provedor ,FileSystem::
:-Encoding utf8
foi adicionado para garantir que o arquivo CSV de saída seja UTF-8 com BOM no Windows PowerShell .Por outro lado, no PowerShell (Core) 7 você teria que usar
-Encoding utf8BOM
[1] Veja esta resposta para obter informações adicionais.