我正在通过 BCP 创建一些报告以通过电子邮件发送。
create TABLE ##tempsss
(
create TABLE ##JOB_DataAssociacao_verContrato
(
F1 VARCHAR(6)
,F2 VARCHAR(200)
,F3 VARCHAR(22)
,F4 char(1)
,F5 varchar(10)
,F6 varchar(15)
,F7 varchar(30)
,F8 varchar(10)
,F9 VARCHAR(18)
) --it needs to be varchar to be able to use header
)
insert into ##tempsss
SELECT
...fields...
FROM some table or view
go
-------------------------------------------------------------
--passo 2 --
exec xp_cmdshell 'bcp "select ''field1'',''field2'',''field3'' UNION ALL select * from table or view" queryout "filepath\filename.xls" -U sa -P password -w -S servername'
-------------------------------------------------------------
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'dba profile or something',
@recipients = 'recipients email',
@subject = 'email subject',
@file_attachments='path\filename.xls'
-------------------------------------------------------------
drop table ##tempsss
有 9k 行,我有一个 2mb 的文件。我只是复制这个文件的内容,然后粘贴到一个空的 excel 文件中,我有 160KB。
如何使用 bcp 但创建较小的文件?
我在通过 dbmail 发送超过 1mb 的文件时遇到了问题。
我将 dbmail 设置为发送 10mb+ 的文件。smtp 也可以。
Excel 在保存文件时在内部使用压缩,这可能是您看到更小的 Excel 文件的最可能原因。
我建议在通过电子邮件发送之前压缩 .bcp 文件。使用命令行压缩器,例如 7-Zip。
此外,我建议通过 -N 选项使用 BCPs Native (-n) 或 Unicode Native 格式。
-c
如果导出中有 Unicode (nvarchar/nchar) 数据类型,请小心使用模式。来自bcp.exe 命令行实用程序的联机丛书:
您可以使用此处的存储过程直接使用全局临时表将数据导出到 Excel 文件:ExportToExcel。查询如下:
执行后,proc 将显示文件位置,您可以轻松访问它。
PS:您也可以使用参数
@MailSubject
并@MailBody
指定电子邮件的正文和主题,该过程的唯一限制是没有在目标服务器上启用 PSGallery,它需要添加并且可能需要安装ImportExcel模块