sql server 2012 查询结果直接生成 excel (版本是2013)

时间:2021-04-12 11:43:29
如题,由于平时查询出来的表太多,一次次的导出比较麻烦,有没有直接生成的语句

24 个解决方案

#1


python 几行代码可以搞定

#2


引用 1 楼 kk185800961 的回复:
python 几行代码可以搞定

没学过哪个,现在只是会一点sql 语句

#3



--开启xp_cmdshell配置选项
EXEC sp_configure 'show advanced options', 1
EXEC sp_configure 'xp_cmdshell', 1
EXEC sp_configure 'show advanced options', 0
--导出execl文件
EXEC master..xp_cmdshell 'bcp "查询的sql语句" queryout 文件路径 -c -S "服务器名称" -U "账号" -P "密码" '

--例如:
EXEC master..xp_cmdshell 'bcp "select * from g_sap_so" queryout D:/test.xls -c -S "." -U "sa" -P "system" '

成功导出后返回的消息
sql server 2012 查询结果直接生成 excel (版本是2013)

#4



http://blog.csdn.net/dcrmg/article/details/52356236

#5


引用 3 楼 qq_37170555 的回复:

--开启xp_cmdshell配置选项
EXEC sp_configure 'show advanced options', 1
EXEC sp_configure 'xp_cmdshell', 1
EXEC sp_configure 'show advanced options', 0
--导出execl文件
EXEC master..xp_cmdshell 'bcp "查询的sql语句" queryout 文件路径 -c -S "服务器名称" -U "账号" -P "密码" '

--例如:
EXEC master..xp_cmdshell 'bcp "select * from g_sap_so" queryout D:/test.xls -c -S "." -U "sa" -P "system" '

成功导出后返回的消息
sql server 2012 查询结果直接生成 excel (版本是2013)




EXEC master..xp_cmdshell 'bcp "select * from [交叉表].dbo.[交叉表]" queryout D:/test.xls -c -S "DESKTOP-AAFLV0F" -U "DESKTOP-AAFLV0F\tao" -P "" '


SQLState = 28000, NativeError = 18456
Error = [Microsoft][SQL Server Native Client 11.0][SQL Server]用户 'DESKTOP-AAFLV0F\tao' 登录失败。
NULL

登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

#6


我这图片上传 后面总是转圈 不能上传图片

#7


引用 5 楼 tvagrant 的回复:
登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

别用windows账户登陆,用sql server的sa登陆

#8


引用 7 楼 qq_37170555 的回复:
Quote: 引用 5 楼 tvagrant 的回复:

登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

别用windows账户登陆,用sql server的sa登陆


sa 默认账号 密码是什么? 在哪能查到。。。。 没用过

#9


引用 8 楼 tvagrant 的回复:
Quote: 引用 7 楼 qq_37170555 的回复:

Quote: 引用 5 楼 tvagrant 的回复:

登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

别用windows账户登陆,用sql server的sa登陆


sa 默认账号 密码是什么? 在哪能查到。。。。 没用过

看看是不是system,如果不是直接修改了
先用windows身份认证登录进去,然后新建查询,输入命令:
 EXECUTE sp_password NULL,'输入新密码','sa'

#10


引用 8 楼 tvagrant 的回复:
Quote: 引用 7 楼 qq_37170555 的回复:

Quote: 引用 5 楼 tvagrant 的回复:

登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

别用windows账户登陆,用sql server的sa登陆


sa 默认账号 密码是什么? 在哪能查到。。。。 没用过

密码是查看不到的,这都能查看的话就完蛋了

#11


引用 9 楼 qq_37170555 的回复:
Quote: 引用 8 楼 tvagrant 的回复:

Quote: 引用 7 楼 qq_37170555 的回复:

Quote: 引用 5 楼 tvagrant 的回复:

登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

别用windows账户登陆,用sql server的sa登陆


sa 默认账号 密码是什么? 在哪能查到。。。。 没用过

看看是不是system,如果不是直接修改了
先用windows身份认证登录进去,然后新建查询,输入命令:
 EXECUTE sp_password NULL,'输入新密码','sa'


标题: 连接到服务器
------------------------------

无法连接到 DESKTOP-AAFLV0F。

------------------------------
其他信息:

已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程。) (Microsoft SQL Server,错误: 233)

有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=233&LinkId=20476

------------------------------

管道的另一端上无任何进程。

------------------------------
按钮:

确定
------------------------------

#12


我用的哪个查询命令去修改 

#13


然后在登录的时候 提示上面 

#14


引用 13 楼 tvagrant 的回复:
然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416

#15


引用 14 楼 qq_37170555 的回复:
Quote: 引用 13 楼 tvagrant 的回复:

然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416


可以导出xls格式,打开文件时候提示 文件合适和扩展名不匹配。文件可能已损坏或不安全
然后导出xlsx格式 直接打不开  这个能解决么? 我用的2013版office 

#16


引用 15 楼 tvagrant 的回复:
Quote: 引用 14 楼 qq_37170555 的回复:

Quote: 引用 13 楼 tvagrant 的回复:

然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416


可以导出xls格式,打开文件时候提示 文件合适和扩展名不匹配。文件可能已损坏或不安全
然后导出xlsx格式 直接打不开  这个能解决么? 我用的2013版office 

直接打开,没有影响,这是正常的

#17


引用 16 楼 qq_37170555 的回复:
Quote: 引用 15 楼 tvagrant 的回复:

Quote: 引用 14 楼 qq_37170555 的回复:

Quote: 引用 13 楼 tvagrant 的回复:

然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416


可以导出xls格式,打开文件时候提示 文件合适和扩展名不匹配。文件可能已损坏或不安全
然后导出xlsx格式 直接打不开  这个能解决么? 我用的2013版office 

直接打开,没有影响,这是正常的


用xls 的打开以后 没有表头了   XLSX的 打不开这个能搞定么? 

#18


引用 17 楼 tvagrant 的回复:
Quote: 引用 16 楼 qq_37170555 的回复:

Quote: 引用 15 楼 tvagrant 的回复:

Quote: 引用 14 楼 qq_37170555 的回复:

Quote: 引用 13 楼 tvagrant 的回复:

然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416


可以导出xls格式,打开文件时候提示 文件合适和扩展名不匹配。文件可能已损坏或不安全
然后导出xlsx格式 直接打不开  这个能解决么? 我用的2013版office 

直接打开,没有影响,这是正常的


用xls 的打开以后 没有表头了   XLSX的 打不开这个能搞定么? 


--数据导出EXCEL  
  
--导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件  
--如果文件不存在,将自动创建文件  
--如果表不存在,将自动创建表  
--基于通用性考虑,仅支持导出标准数据类型  
  
/*--调用示例  
  
p_exporttb @sqlstr='SELECT * FROM [G-SAP-Customer]'  
,@path='c:\',@fname='aa.xls',@sheetname='地区资料'  
--
*/ 
 
CREATE  proc p_exporttb  
@sqlstr varchar(8000),--查询语句,如果查询语句中使用了order by ,请加上top 100 percent  
@path nvarchar(1000),--文件存放目录  
@fname nvarchar(250),--文件名  
@sheetname varchar(250)=''--要创建的工作表名,默认为文件名  
as  
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int  
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)  
  
--参数检测  
if isnull(@fname,'')=''set @fname='temp2012.xls'  
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')  
  
--检查文件是否已经存在  
if right(@path,1)<>'\' set @path=@path+'\'  
create table #tb(a bit,b bit,c bit)  
set @sql=@path+@fname  
insert into #tb exec master..xp_fileexist @sql  
  
--数据库创建语句  
set @sql=@path+@fname  
if exists(select 1 from #tb where a=1)  
set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'  
+';CREATE_DB="'+@sql+'";DBQ='+@sql  
else  
set @constr='Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties="Excel 8.0;HDR=YES'  
+';DATABASE='+@sql+'"'  
  
--连接数据库  
exec @err=sp_oacreate 'adodb.connection',@obj out  
if @err<>0 goto lberr  
  
exec @err=sp_oamethod @obj,'open',null,@constr  
if @err<>0 goto lberr  
  
--创建表的SQL  
declare @tbname sysname  
set @tbname='##tmp_'+convert(varchar(38),newid())  
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'  
exec(@sql)  
  
select @sql='',@fdlist=''  
select @fdlist=@fdlist+',['+a.name+']'  
,@sql=@sql+',['+a.name+'] '  
+case  
when b.name like '%char'  
then case when a.length>255 then 'memo'  
else 'text('+cast(a.length as varchar)+')' end  
when b.name like '%int' or b.name='bit' then 'int'  
when b.name like '%datetime' then 'datetime'  
when b.name like '%money' then 'money'  
when b.name like '%text' then 'memo'  
else b.name end  
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype  
where b.name not in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')  
and a.id=(select id from tempdb..sysobjects where name=@tbname)  
  
if @@rowcount=0 return  
  
select @sql='create table ['+@sheetname  
+']('+substring(@sql,2,8000)+')'  
,@fdlist=substring(@fdlist,2,8000)  
  
exec @err=sp_oamethod @obj,'execute',@out out,@sql  
if @err<>0 goto lberr  
  
exec @err=sp_oadestroy @obj  
  
--导入数据  
set @sql='openrowset(''Microsoft.ACE.OLEDB.12.0'',''Excel 8.0;HDR=YES  
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'  
  
exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')  
  
set @sql='drop table ['+@tbname+']'  
exec(@sql)  
return  
  
lberr:  
exec sp_oageterrorinfo 0,@src out,@desc out  
lbexit:  
select cast(@err as varbinary(4)) as 错误号  
,@src as 错误源,@desc as 错误描述  
select @sql,@constr,@fdlist  

用这个存储过程试试,导出后会有表头

#19


通常建议导出 csv 就行了,反正 excel 打开也没问题
导出标准的 Excel 比较累

#20


http://download.csdn.net/download/yenange/9933743
配置一下连接串和sql语句就可以了, 配合Windows定时任务可以定时导出。

#21


通常建议导出 csv 就行了,反正 excel 打开

#22


引用 18 楼 qq_37170555 的回复:
Quote: 引用 17 楼 tvagrant 的回复:

Quote: 引用 16 楼 qq_37170555 的回复:

Quote: 引用 15 楼 tvagrant 的回复:

Quote: 引用 14 楼 qq_37170555 的回复:

Quote: 引用 13 楼 tvagrant 的回复:

然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416


可以导出xls格式,打开文件时候提示 文件合适和扩展名不匹配。文件可能已损坏或不安全
然后导出xlsx格式 直接打不开  这个能解决么? 我用的2013版office 

直接打开,没有影响,这是正常的


用xls 的打开以后 没有表头了   XLSX的 打不开这个能搞定么? 


--数据导出EXCEL  
  
--导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件  
--如果文件不存在,将自动创建文件  
--如果表不存在,将自动创建表  
--基于通用性考虑,仅支持导出标准数据类型  
  
/*--调用示例  
  
p_exporttb @sqlstr='SELECT * FROM [G-SAP-Customer]'  
,@path='c:\',@fname='aa.xls',@sheetname='地区资料'  
--
*/ 
 
CREATE  proc p_exporttb  
@sqlstr varchar(8000),--查询语句,如果查询语句中使用了order by ,请加上top 100 percent  
@path nvarchar(1000),--文件存放目录  
@fname nvarchar(250),--文件名  
@sheetname varchar(250)=''--要创建的工作表名,默认为文件名  
as  
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int  
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)  
  
--参数检测  
if isnull(@fname,'')=''set @fname='temp2012.xls'  
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')  
  
--检查文件是否已经存在  
if right(@path,1)<>'\' set @path=@path+'\'  
create table #tb(a bit,b bit,c bit)  
set @sql=@path+@fname  
insert into #tb exec master..xp_fileexist @sql  
  
--数据库创建语句  
set @sql=@path+@fname  
if exists(select 1 from #tb where a=1)  
set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'  
+';CREATE_DB="'+@sql+'";DBQ='+@sql  
else  
set @constr='Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties="Excel 8.0;HDR=YES'  
+';DATABASE='+@sql+'"'  
  
--连接数据库  
exec @err=sp_oacreate 'adodb.connection',@obj out  
if @err<>0 goto lberr  
  
exec @err=sp_oamethod @obj,'open',null,@constr  
if @err<>0 goto lberr  
  
--创建表的SQL  
declare @tbname sysname  
set @tbname='##tmp_'+convert(varchar(38),newid())  
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'  
exec(@sql)  
  
select @sql='',@fdlist=''  
select @fdlist=@fdlist+',['+a.name+']'  
,@sql=@sql+',['+a.name+'] '  
+case  
when b.name like '%char'  
then case when a.length>255 then 'memo'  
else 'text('+cast(a.length as varchar)+')' end  
when b.name like '%int' or b.name='bit' then 'int'  
when b.name like '%datetime' then 'datetime'  
when b.name like '%money' then 'money'  
when b.name like '%text' then 'memo'  
else b.name end  
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype  
where b.name not in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')  
and a.id=(select id from tempdb..sysobjects where name=@tbname)  
  
if @@rowcount=0 return  
  
select @sql='create table ['+@sheetname  
+']('+substring(@sql,2,8000)+')'  
,@fdlist=substring(@fdlist,2,8000)  
  
exec @err=sp_oamethod @obj,'execute',@out out,@sql  
if @err<>0 goto lberr  
  
exec @err=sp_oadestroy @obj  
  
--导入数据  
set @sql='openrowset(''Microsoft.ACE.OLEDB.12.0'',''Excel 8.0;HDR=YES  
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'  
  
exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')  
  
set @sql='drop table ['+@tbname+']'  
exec(@sql)  
return  
  
lberr:  
exec sp_oageterrorinfo 0,@src out,@desc out  
lbexit:  
select cast(@err as varbinary(4)) as 错误号  
,@src as 错误源,@desc as 错误描述  
select @sql,@constr,@fdlist  

用这个存储过程试试,导出后会有表头

这个强!!

#23


sql server 2012 查询结果直接生成 excel (版本是2013)

#24


用bcp速度快

#1


python 几行代码可以搞定

#2


引用 1 楼 kk185800961 的回复:
python 几行代码可以搞定

没学过哪个,现在只是会一点sql 语句

#3



--开启xp_cmdshell配置选项
EXEC sp_configure 'show advanced options', 1
EXEC sp_configure 'xp_cmdshell', 1
EXEC sp_configure 'show advanced options', 0
--导出execl文件
EXEC master..xp_cmdshell 'bcp "查询的sql语句" queryout 文件路径 -c -S "服务器名称" -U "账号" -P "密码" '

--例如:
EXEC master..xp_cmdshell 'bcp "select * from g_sap_so" queryout D:/test.xls -c -S "." -U "sa" -P "system" '

成功导出后返回的消息
sql server 2012 查询结果直接生成 excel (版本是2013)

#4



http://blog.csdn.net/dcrmg/article/details/52356236

#5


引用 3 楼 qq_37170555 的回复:

--开启xp_cmdshell配置选项
EXEC sp_configure 'show advanced options', 1
EXEC sp_configure 'xp_cmdshell', 1
EXEC sp_configure 'show advanced options', 0
--导出execl文件
EXEC master..xp_cmdshell 'bcp "查询的sql语句" queryout 文件路径 -c -S "服务器名称" -U "账号" -P "密码" '

--例如:
EXEC master..xp_cmdshell 'bcp "select * from g_sap_so" queryout D:/test.xls -c -S "." -U "sa" -P "system" '

成功导出后返回的消息
sql server 2012 查询结果直接生成 excel (版本是2013)




EXEC master..xp_cmdshell 'bcp "select * from [交叉表].dbo.[交叉表]" queryout D:/test.xls -c -S "DESKTOP-AAFLV0F" -U "DESKTOP-AAFLV0F\tao" -P "" '


SQLState = 28000, NativeError = 18456
Error = [Microsoft][SQL Server Native Client 11.0][SQL Server]用户 'DESKTOP-AAFLV0F\tao' 登录失败。
NULL

登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

#6


我这图片上传 后面总是转圈 不能上传图片

#7


引用 5 楼 tvagrant 的回复:
登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

别用windows账户登陆,用sql server的sa登陆

#8


引用 7 楼 qq_37170555 的回复:
Quote: 引用 5 楼 tvagrant 的回复:

登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

别用windows账户登陆,用sql server的sa登陆


sa 默认账号 密码是什么? 在哪能查到。。。。 没用过

#9


引用 8 楼 tvagrant 的回复:
Quote: 引用 7 楼 qq_37170555 的回复:

Quote: 引用 5 楼 tvagrant 的回复:

登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

别用windows账户登陆,用sql server的sa登陆


sa 默认账号 密码是什么? 在哪能查到。。。。 没用过

看看是不是system,如果不是直接修改了
先用windows身份认证登录进去,然后新建查询,输入命令:
 EXECUTE sp_password NULL,'输入新密码','sa'

#10


引用 8 楼 tvagrant 的回复:
Quote: 引用 7 楼 qq_37170555 的回复:

Quote: 引用 5 楼 tvagrant 的回复:

登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

别用windows账户登陆,用sql server的sa登陆


sa 默认账号 密码是什么? 在哪能查到。。。。 没用过

密码是查看不到的,这都能查看的话就完蛋了

#11


引用 9 楼 qq_37170555 的回复:
Quote: 引用 8 楼 tvagrant 的回复:

Quote: 引用 7 楼 qq_37170555 的回复:

Quote: 引用 5 楼 tvagrant 的回复:

登录时候  window身份验证  用户名:DESKTOP-AAFLV0F\tao  密码是空的  

别用windows账户登陆,用sql server的sa登陆


sa 默认账号 密码是什么? 在哪能查到。。。。 没用过

看看是不是system,如果不是直接修改了
先用windows身份认证登录进去,然后新建查询,输入命令:
 EXECUTE sp_password NULL,'输入新密码','sa'


标题: 连接到服务器
------------------------------

无法连接到 DESKTOP-AAFLV0F。

------------------------------
其他信息:

已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程。) (Microsoft SQL Server,错误: 233)

有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=233&LinkId=20476

------------------------------

管道的另一端上无任何进程。

------------------------------
按钮:

确定
------------------------------

#12


我用的哪个查询命令去修改 

#13


然后在登录的时候 提示上面 

#14


引用 13 楼 tvagrant 的回复:
然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416

#15


引用 14 楼 qq_37170555 的回复:
Quote: 引用 13 楼 tvagrant 的回复:

然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416


可以导出xls格式,打开文件时候提示 文件合适和扩展名不匹配。文件可能已损坏或不安全
然后导出xlsx格式 直接打不开  这个能解决么? 我用的2013版office 

#16


引用 15 楼 tvagrant 的回复:
Quote: 引用 14 楼 qq_37170555 的回复:

Quote: 引用 13 楼 tvagrant 的回复:

然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416


可以导出xls格式,打开文件时候提示 文件合适和扩展名不匹配。文件可能已损坏或不安全
然后导出xlsx格式 直接打不开  这个能解决么? 我用的2013版office 

直接打开,没有影响,这是正常的

#17


引用 16 楼 qq_37170555 的回复:
Quote: 引用 15 楼 tvagrant 的回复:

Quote: 引用 14 楼 qq_37170555 的回复:

Quote: 引用 13 楼 tvagrant 的回复:

然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416


可以导出xls格式,打开文件时候提示 文件合适和扩展名不匹配。文件可能已损坏或不安全
然后导出xlsx格式 直接打不开  这个能解决么? 我用的2013版office 

直接打开,没有影响,这是正常的


用xls 的打开以后 没有表头了   XLSX的 打不开这个能搞定么? 

#18


引用 17 楼 tvagrant 的回复:
Quote: 引用 16 楼 qq_37170555 的回复:

Quote: 引用 15 楼 tvagrant 的回复:

Quote: 引用 14 楼 qq_37170555 的回复:

Quote: 引用 13 楼 tvagrant 的回复:

然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416


可以导出xls格式,打开文件时候提示 文件合适和扩展名不匹配。文件可能已损坏或不安全
然后导出xlsx格式 直接打不开  这个能解决么? 我用的2013版office 

直接打开,没有影响,这是正常的


用xls 的打开以后 没有表头了   XLSX的 打不开这个能搞定么? 


--数据导出EXCEL  
  
--导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件  
--如果文件不存在,将自动创建文件  
--如果表不存在,将自动创建表  
--基于通用性考虑,仅支持导出标准数据类型  
  
/*--调用示例  
  
p_exporttb @sqlstr='SELECT * FROM [G-SAP-Customer]'  
,@path='c:\',@fname='aa.xls',@sheetname='地区资料'  
--
*/ 
 
CREATE  proc p_exporttb  
@sqlstr varchar(8000),--查询语句,如果查询语句中使用了order by ,请加上top 100 percent  
@path nvarchar(1000),--文件存放目录  
@fname nvarchar(250),--文件名  
@sheetname varchar(250)=''--要创建的工作表名,默认为文件名  
as  
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int  
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)  
  
--参数检测  
if isnull(@fname,'')=''set @fname='temp2012.xls'  
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')  
  
--检查文件是否已经存在  
if right(@path,1)<>'\' set @path=@path+'\'  
create table #tb(a bit,b bit,c bit)  
set @sql=@path+@fname  
insert into #tb exec master..xp_fileexist @sql  
  
--数据库创建语句  
set @sql=@path+@fname  
if exists(select 1 from #tb where a=1)  
set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'  
+';CREATE_DB="'+@sql+'";DBQ='+@sql  
else  
set @constr='Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties="Excel 8.0;HDR=YES'  
+';DATABASE='+@sql+'"'  
  
--连接数据库  
exec @err=sp_oacreate 'adodb.connection',@obj out  
if @err<>0 goto lberr  
  
exec @err=sp_oamethod @obj,'open',null,@constr  
if @err<>0 goto lberr  
  
--创建表的SQL  
declare @tbname sysname  
set @tbname='##tmp_'+convert(varchar(38),newid())  
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'  
exec(@sql)  
  
select @sql='',@fdlist=''  
select @fdlist=@fdlist+',['+a.name+']'  
,@sql=@sql+',['+a.name+'] '  
+case  
when b.name like '%char'  
then case when a.length>255 then 'memo'  
else 'text('+cast(a.length as varchar)+')' end  
when b.name like '%int' or b.name='bit' then 'int'  
when b.name like '%datetime' then 'datetime'  
when b.name like '%money' then 'money'  
when b.name like '%text' then 'memo'  
else b.name end  
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype  
where b.name not in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')  
and a.id=(select id from tempdb..sysobjects where name=@tbname)  
  
if @@rowcount=0 return  
  
select @sql='create table ['+@sheetname  
+']('+substring(@sql,2,8000)+')'  
,@fdlist=substring(@fdlist,2,8000)  
  
exec @err=sp_oamethod @obj,'execute',@out out,@sql  
if @err<>0 goto lberr  
  
exec @err=sp_oadestroy @obj  
  
--导入数据  
set @sql='openrowset(''Microsoft.ACE.OLEDB.12.0'',''Excel 8.0;HDR=YES  
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'  
  
exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')  
  
set @sql='drop table ['+@tbname+']'  
exec(@sql)  
return  
  
lberr:  
exec sp_oageterrorinfo 0,@src out,@desc out  
lbexit:  
select cast(@err as varbinary(4)) as 错误号  
,@src as 错误源,@desc as 错误描述  
select @sql,@constr,@fdlist  

用这个存储过程试试,导出后会有表头

#19


通常建议导出 csv 就行了,反正 excel 打开也没问题
导出标准的 Excel 比较累

#20


http://download.csdn.net/download/yenange/9933743
配置一下连接串和sql语句就可以了, 配合Windows定时任务可以定时导出。

#21


通常建议导出 csv 就行了,反正 excel 打开

#22


引用 18 楼 qq_37170555 的回复:
Quote: 引用 17 楼 tvagrant 的回复:

Quote: 引用 16 楼 qq_37170555 的回复:

Quote: 引用 15 楼 tvagrant 的回复:

Quote: 引用 14 楼 qq_37170555 的回复:

Quote: 引用 13 楼 tvagrant 的回复:

然后在登录的时候 提示上面 

看看这个博客,应该是没开启sql server登陆
http://blog.csdn.net/github_35160620/article/details/52676416


可以导出xls格式,打开文件时候提示 文件合适和扩展名不匹配。文件可能已损坏或不安全
然后导出xlsx格式 直接打不开  这个能解决么? 我用的2013版office 

直接打开,没有影响,这是正常的


用xls 的打开以后 没有表头了   XLSX的 打不开这个能搞定么? 


--数据导出EXCEL  
  
--导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件  
--如果文件不存在,将自动创建文件  
--如果表不存在,将自动创建表  
--基于通用性考虑,仅支持导出标准数据类型  
  
/*--调用示例  
  
p_exporttb @sqlstr='SELECT * FROM [G-SAP-Customer]'  
,@path='c:\',@fname='aa.xls',@sheetname='地区资料'  
--
*/ 
 
CREATE  proc p_exporttb  
@sqlstr varchar(8000),--查询语句,如果查询语句中使用了order by ,请加上top 100 percent  
@path nvarchar(1000),--文件存放目录  
@fname nvarchar(250),--文件名  
@sheetname varchar(250)=''--要创建的工作表名,默认为文件名  
as  
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int  
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)  
  
--参数检测  
if isnull(@fname,'')=''set @fname='temp2012.xls'  
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')  
  
--检查文件是否已经存在  
if right(@path,1)<>'\' set @path=@path+'\'  
create table #tb(a bit,b bit,c bit)  
set @sql=@path+@fname  
insert into #tb exec master..xp_fileexist @sql  
  
--数据库创建语句  
set @sql=@path+@fname  
if exists(select 1 from #tb where a=1)  
set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'  
+';CREATE_DB="'+@sql+'";DBQ='+@sql  
else  
set @constr='Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties="Excel 8.0;HDR=YES'  
+';DATABASE='+@sql+'"'  
  
--连接数据库  
exec @err=sp_oacreate 'adodb.connection',@obj out  
if @err<>0 goto lberr  
  
exec @err=sp_oamethod @obj,'open',null,@constr  
if @err<>0 goto lberr  
  
--创建表的SQL  
declare @tbname sysname  
set @tbname='##tmp_'+convert(varchar(38),newid())  
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'  
exec(@sql)  
  
select @sql='',@fdlist=''  
select @fdlist=@fdlist+',['+a.name+']'  
,@sql=@sql+',['+a.name+'] '  
+case  
when b.name like '%char'  
then case when a.length>255 then 'memo'  
else 'text('+cast(a.length as varchar)+')' end  
when b.name like '%int' or b.name='bit' then 'int'  
when b.name like '%datetime' then 'datetime'  
when b.name like '%money' then 'money'  
when b.name like '%text' then 'memo'  
else b.name end  
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype  
where b.name not in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')  
and a.id=(select id from tempdb..sysobjects where name=@tbname)  
  
if @@rowcount=0 return  
  
select @sql='create table ['+@sheetname  
+']('+substring(@sql,2,8000)+')'  
,@fdlist=substring(@fdlist,2,8000)  
  
exec @err=sp_oamethod @obj,'execute',@out out,@sql  
if @err<>0 goto lberr  
  
exec @err=sp_oadestroy @obj  
  
--导入数据  
set @sql='openrowset(''Microsoft.ACE.OLEDB.12.0'',''Excel 8.0;HDR=YES  
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'  
  
exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')  
  
set @sql='drop table ['+@tbname+']'  
exec(@sql)  
return  
  
lberr:  
exec sp_oageterrorinfo 0,@src out,@desc out  
lbexit:  
select cast(@err as varbinary(4)) as 错误号  
,@src as 错误源,@desc as 错误描述  
select @sql,@constr,@fdlist  

用这个存储过程试试,导出后会有表头

这个强!!

#23


sql server 2012 查询结果直接生成 excel (版本是2013)

#24


用bcp速度快