(旧调重弹,100分)从SQL SERVER导出表数据到EXCEL,要求表字段也要导出EXCEL。

yzr220 2003-09-13 09:17:12
1、SQL SERVER ===》EXCEL 的数据转移 用 BCP 实现,我已经学会,就象如下语句:EXEC master..xp_cmdshell 'bcp 库名.dbo.表名out c:\Temp.xls -c -q -S"servername" -U"sa" -P""'
2、但这样导出形成的EXCEL文件没有 原表 的对应列名,我寻遍SQL SERVER的帮助文件和网络资源,找不到相关线索
3、用DTS导出固定字段数目的表可能是合适的,但因为我用语句生成的表是“交叉表”(也即列数不固定,有可能是10列,也有可能是60列),DTS要求先定义好[数据源]与[目的地]的对应关系,(而后以任务方式执行),所以我没有办法用DTS来做
4、因为我需要做一个报表程序,已经把“能产生预期结果的语句”做成后台的“存储进程”了,但公司内部的格式要求,使得直接打印出来的报表不能合格,所以想到导出到EXCEL,由操作人员来编辑,这样当然需要有原先表的列名称啦!
5、关于BCP,我去仔细查看了相关书籍,发现一般都没有提到‘字段名称’引出的说法,可能从BCP作为数据导入导出工具是正确的,不是‘数据结构导入导出工具’。至于要在EXCEL文件中有字段名称,可以采取在‘EXCEL’内用‘QUERY’查询工具,设立选项从SQL SERVER 中获取表,这样就会有字段名称了, “一个是给,一个是拿”,思维角度不同。应该只能这样绕开,否则要采取如下方法:
(5.1)、用BCP 引出 SQL表的 格式文本A(内容包括 字段名称)
(5.2)、用语句把‘字段名称’从A中取出,再放入取应EXCEL文件的第一行。

但是这样的方法对一般的用户来说还是太麻烦,不知哪位大侠能指点一二,能更方便一点?
...全文
37 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzr220 2003-09-15
  • 打赏
  • 举报
回复
好象是可以的,我再细细琢磨琢磨!

谢谢大力。我马上结贴,并且另开一题(各位不好意思,在标题上写了100,实际却设了20分,如果确实有好的方法,我会另开标题,并附上80分的。),请大力麻烦再把本解决方法写在上面,我也马上结贴!

最后还要对“大力”表示衷心的感谢!
yzr220 2003-09-15
  • 打赏
  • 举报
回复
好象是可以的,我再细细琢磨琢磨!

谢谢大力。我马上结贴,并且另开一题(各位不好意思,在标题上写了100,实际却设了20分,如果确实有好的方法,我会另开标题,并附上80分的。),请大力麻烦再把本解决方法写在上面,我也马上结贴!

最后还要对“大力”表示衷心的感谢!
pengdali 2003-09-15
  • 打赏
  • 举报
回复
CREATE proc out2xls
@服务器名 varchar(255),
@库名 varchar(255),
@表名 varchar(255),
@用户名 varchar(100),
@密码 varchar(100),
@路径及文件名 varchar(255)
as
declare @temp1 nvarchar(4000),@temp2 varchar(8000)

set @temp1='select @value1='''',@value2='''' select @value1=@value1+'',''''''+a.name+''''+char(39)+'' [''+a.name+'']'',@value2=@value2+'',cast(''+''[''+a.name+'']''+ '' as varchar(200))'' from '+@库名+'..syscolumns a,'+@库名+'..sysobjects d where a.id=d.id and d.name='''+@表名+''''+' order by a.colorder'


exec sp_executesql @temp1,N'@value1 nvarchar(4000) output , @value2 varchar(8000) output',@temp1 output,@temp2 output

select @temp1=right(@temp1,len(@temp1)-1),@temp2=right(@temp2,len(@temp2)-1)

exec('select * into '+@库名+'.dbo.中间表 from (select '+ @temp1+' union all SELECT '+@temp2+' FROM '+@库名+'..'+@表名+') tem3')


set @temp2='bcp '+@库名+'.dbo.中间表 out '+@路径及文件名+' -c -S'+@服务器名+' -U'+@用户名+' -P'+@密码

EXEC master..xp_cmdshell @temp2
exec('drop table '+@库名+'.dbo.中间表')
GO
exec out2xls 'daliserver','pubs','jobs','sa','element','c:\a.txt'
go
drop proc out2xls
yzr220 2003-09-15
  • 打赏
  • 举报
回复
to w_rose
已经看到你的贴子,但是“http://upload.smiling.com/file/152580/sqlsvr2xls.rar”这个地址没法下载,连ping http://upload.smiling.com 或 ping upload.smiling.com都不行,你能邮给我吗? (yzr220@163.net 或 huamao@huamao.com)

谢谢!
benxie 2003-09-14
  • 打赏
  • 举报
回复
gzing
w_rose 2003-09-14
  • 打赏
  • 举报
回复
sqlsvr2xls.dat中参数:

第一行,待打开的excel工作簿的路径和名称。
第二行,工作簿中的表格名。必须已经有此表。
第三行, 数据库连接参数。
第四行,任意的Select查询语句。
w_rose 2003-09-14
  • 打赏
  • 举报
回复
好容易找了一个地方上传文件。

其中运行参数写在sqlsvr2xls.dat中,首先编辑一下。

10K。第一次运行时会报告“数字签名”信息并要求确认。

http://upload.smiling.com/file/152580/sqlsvr2xls.rar
w_rose 2003-09-14
  • 打赏
  • 举报
回复
稍等,我给你写个小程序。
eastpond 2003-09-13
  • 打赏
  • 举报
回复
关注
yzr220 2003-09-13
  • 打赏
  • 举报
回复
UP
yzr220 2003-09-13
  • 打赏
  • 举报
回复
各位不好意思,在标题上写了100,实际却设了20分,
如果确实有好的方法,我会另开标题,并附上80分的。


谢谢
yzr220 2003-09-13
  • 打赏
  • 举报
回复
UP
huahaoyueyuan 2003-09-13
  • 打赏
  • 举报
回复
我也碰到你说的事情,可惜我不会,你会了可以告诉我一下吗
yzr220 2003-09-13
  • 打赏
  • 举报
回复
UP
zjcxc 2003-09-13
  • 打赏
  • 举报
回复
如果你要用BCP来完成,就只能用类似下面的方法:
用BCP 引出 SQL表的 格式文本A(内容包括 字段名称)
用语句把‘字段名称’从A中取出,再放入取应EXCEL文件的第一行。


如果是在前台程序中处理,就灵活很多.
yzr220 2003-09-13
  • 打赏
  • 举报
回复
我看到了
huahaoyueyuan 2003-09-13
  • 打赏
  • 举报
回复
有呀,我不是告诉你了吗missly999@yahoo.com.cn
我给你发的短信你收到了吗
yzr220 2003-09-13
  • 打赏
  • 举报
回复
致 huahaoyueyuan(珊珊) :有没有邮箱,万一我有解决的方法,我再告诉你。
yzr220 2003-09-13
  • 打赏
  • 举报
回复
UP

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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