用SQL Server生成Excel作为附件发送的问题

jiang5311 2017-03-16 09:39:04

EXEC master..xp_cmdshell 'bcp "select * from dbo.TestTable" queryout E:\Reports\myReport.xls -c -q -S"server" -U"sa" -P"sa"'



在SQL Server中用语句生成一个Excel,然后保存到文件夹中,最后用DBmail自动发送的。
在电脑上,它会提示文件不安全,点击yes后才可以打开,可是在手机邮件上直接不提示。
怎么解决这个问题?谢谢啦!

the file format and extension don't match. The file could be corrupted or unsafe. Unless you trust its source, don't open it. Do you want to open it anyway?
...全文
678 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiang5311 2017-03-20
  • 打赏
  • 举报
回复
引用 12 楼 Tiger_Zhao 的回复:
连买不了包子的分都不给
我也想给啊,可是系统提示我的分值不够了,好久不上CSDN了,要怎么样才能转换分?
Tiger_Zhao 2017-03-20
  • 打赏
  • 举报
回复
连买不了包子的分都不给
jiang5311 2017-03-19
  • 打赏
  • 举报
回复
使用BCP命令导出和导入数据常用的参数如下 bcp {[[database_name.][schema_name]].{table_name | view_name} | "query"} {in | out | queryout} 数据文件 [-c 字符类型] | [-w 宽字符类型] [-t 字段终止符] [-r 行终止符] [-i 输入文件] [-o 输出文件] [-S 服务器名称] [-U 用户名] [-P 密码] [-T 可信连接] [-d 数据库名称] [-k 保留NULL值] -c 使用char类型做为存储类型,没有前缀且以"\t"做为字段分割符,以"\n"做为行分割符。 -w 使用Unicode字符集拷贝数据,在数据库中,需要将Table Column设置为 nchar或nvarchar存储类型。如果 -c 和 -w 同时指定,那么 -w 将覆盖 -c。 -t field_term 指定column分割符,默认是"\t"。 -r row_term 指定row分割符,默认是"\n"。 -S server_name[ \instance_name] 指定要连接的SQL Server服务器的实例,如果未指定此选项,BCP连接本机的SQL Server默认实例。如果要连接某台机器上的默认实例,只需要指定机器名即可。 -U login_id 指定连接SQL Sever的用户名。 -P password 指定连接SQL Server的用户名密码。 -T 指定BCP使用信任连接登录SQL Server。如果未指定-T,必须指定-U和-P。 -d 指定数据库名称 -k 指定空列使用null值插入,而不是这列的默认值。 --导出,分隔符是“分隔符” EXEC master..xp_cmdshell 'bcp "select * From log.dbo.[table]" queryout E:\out.txt -c -t 分隔符' --导入,分隔符是“分隔符” EXEC master..xp_cmdshell 'bcp log.dbo.[20] in E:\out.txt -c -t 分隔符' 感谢大家的回复,这个问题的角度让我给了我解决方案! 用上面的加分隔符的办法,已经搞定,再次感谢!结贴!
Tiger_Zhao 2017-03-17
  • 打赏
  • 举报
回复
参数 -c 是TSV格式,CSV格式需要用到格式文件。
比如我数据库MyTest有个table1要导出,
1)下面的命令生成格式文件
EXEC master..xp_cmdshell 'bcp mytest.dbo.table1 format nul -c -f X:\table1.fmt -T'

生成的格式文件table1.fmt内容如下
9.0
2
1 SQLCHAR 0 12 "\t" 1 id ""
2 SQLCHAR 0 12 "\r\n" 2 x ""

2)改为逗号分隔
9.0
2
1 SQLCHAR 0 12 "," 1 id ""
2 SQLCHAR 0 12 "\r\n" 2 x ""

3)以后就可以用下面的命令导出CSV了
EXEC master..xp_cmdshell 'bcp mytest.dbo.table1 out X:\table1.csv -f X:\table1.fmt -T'

shoppo0505 2017-03-17
  • 打赏
  • 举报
回复
引用 8 楼 jiang5311 的回复:
如果生成csv,手机邮件里面可以看。 EXEC master..xp_cmdshell 'bcp "select * from dbo.TestTable" queryout E:\Reports\myReport.csv -c -q -S"server" -U"sa" -P"sa"' 但是,电脑上面看就变成这样了... 有没有两全的解决办法?csv带分隔符,或者xls文件不提示,就都可以在手机和电脑上看附件了。
你生成csv,起个xls后缀, 在电脑上的话,在环境设置中,修改分割符就能展示表格了(分列). 默认是分号,你这个文件中,分隔符都没有加,怎么都不可能分列显示。
Tiger_Zhao 2017-03-16
  • 打赏
  • 举报
回复
手机上没装Office,或者装的Office版本太低。
jiang5311 2017-03-16
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
什么版本的office?excel是xls还是xlsx?
目前生成文件是在SQL Server端生成的,Server端没有安装Office,我们自己是在office2013中打开的。 另外还有手机邮件,手机邮件是无法打开的。
shoppo0505 2017-03-16
  • 打赏
  • 举报
回复
什么版本的office?excel是xls还是xlsx?
jiang5311 2017-03-16
  • 打赏
  • 举报
回复


如果生成csv,手机邮件里面可以看。
EXEC master..xp_cmdshell 'bcp "select * from dbo.TestTable" queryout E:\Reports\myReport.csv -c -q -S"server" -U"sa" -P"sa"'

但是,电脑上面看就变成这样了...
有没有两全的解决办法?csv带分隔符,或者xls文件不提示,就都可以在手机和电脑上看附件了。
jiang5311 2017-03-16
  • 打赏
  • 举报
回复
引用 5 楼 Tiger_Zhao 的回复:
你导出的实际是CSV? 那你干吗命名为.xls后缀?——误导啊! 猜想原因 1)估计里面有些数据不是很符合csv标准,用帖子《关于bcp导出数据,数据中带有换行的问题》中的方法处理一下。 2)数据里面有类似脚本/嵌入对象之类的内容,被识别为不安全。关闭杀毒软件试试。
这位朋友说的很有道理,我尝试了一下,不生成xls,生成csv,打开的时候,就不报提醒了,手机邮件里面也可以正常打开! 可是,在电脑上看,中间没有分隔符,难道只能在手机或者电脑上取一样?
唐诗三百首 2017-03-16
  • 打赏
  • 举报
回复
没有捷径, 建议用前端程序实现, 查出数据到DataTable-->生成Excel-文件->连接邮件服务器-->发送邮件.
Tiger_Zhao 2017-03-16
  • 打赏
  • 举报
回复
你导出的实际是CSV?
那你干吗命名为.xls后缀?——误导啊!

猜想原因
1)估计里面有些数据不是很符合csv标准,用帖子《关于bcp导出数据,数据中带有换行的问题》中的方法处理一下。
2)数据里面有类似脚本/嵌入对象之类的内容,被识别为不安全。关闭杀毒软件试试。
jiang5311 2017-03-16
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
手机上没装Office,或者装的Office版本太低。
不是的,其他的邮件含有excel附件的都是可以打开的,只有这个不行。

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧