Existe uma maneira elegante de enviar os resultados da consulta diretamente para uma impressora física?

14

Eu tenho esse pedido estranho para que um relatório seja agendado e impresso em uma impressora .

O relatório em si é bastante simples e cabe em uma única página. Posso imprimi-lo em um txt e isso será ótimo (embora eu esteja aberto a sugestões sobre um produto melhor).

Aqui está o código. Funciona. Mas eu não gosto disso. Especificamente, eu gostaria de acabar com o @bcp e o @SQL aninhados.

Pergunta: Existe uma maneira mais elegante de fazer isso?

declare @filepath varchar(255),
@filename varchar(255),
@filetype varchar(255),
@sql nvarchar(max),
@coverpage_text nvarchar(max)

set @filepath = 'C:\users\jmay\documents\'
SET @filename = 'TestFile'
set @filetype = '.txt'

--output to txt
set @sql = N'declare @bcp varchar(4000)
set @bcp = ''bcp " select * from test_data " queryout ' 
+ @filepath +  @filename + @filetype + ' -t " - " -c -T -d DBA''
print @bcp

EXECUTE master.dbo.xp_cmdshell @BCP'

print @sql
 exec sp_executesql @sql

--print data
 set @sql = N'declare @bcp varchar(4000)
set @bcp = ''START /MIN NOTEPAD /P ' + @filepath +  @filename +  @filetype + '''
print @bcp

EXECUTE master.dbo.xp_cmdshell @BCP'

print @sql
exec sp_executesql @sql
James
fonte

Respostas:

36

Execute a consulta usando POWERSHELLe OUT-PRINTER

Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance .   | Out-Printer

O cmdlet Out-Printer envia a saída para a impressora padrão ou para uma impressora alternativa, se uma for especificada.

Scott Hodgin
fonte
4
Funcionou como mágica, o mesmo código pode ser reduzido para: Invoke-Sqlcmd -Query "SELECT * from dba..test_data;" | Out-Printer Agendei-o como um trabalho e bam. Obrigado pela ajuda!
James