调用语句:p_exporttb @sqlstr='select * from Shop_tblAccess' ,@path='D:\wwwroot\Shop\test\',@fname='a.xls',@sheetname='b'在sqlserver查询分析器里面第一次执行出错提示:(所影响的行数为 1 行)
(所影响的行数为 26 行)服务器: 消息 7405,级别 16,状态 1,行 1
异类查询要求为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项。这将确保一致的查询语义。请启用这些选项,然后重新发出查询。在sqlserver查询分析器里面第二次执行出错提示贴图如下:
执行出错后,发现在目录'D:\wwwroot\Shop\test\下面有a.xls这个文件,excel表里面字段名也有,可是就没有数据。请问如何解决,在线急等啊!!!附录:存储过程如下if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_exporttb]
GO/**//*--数据导出EXCEL
 
 导出表中的数据到Excel,包含字段名,文件为真正的Excel文件
 ,如果文件不存在,将自动创建文件
 ,如果表不存在,将自动创建表
 基于通用性考虑,仅支持导出标准数据类型--邹建 2003.10(引用请保留此信息)--*//**//*--调用示例 p_exporttb @tbname='地区资料',@path='c:',@fname='aa.xls'
--*/
create proc p_exporttb
@tbname sysname,    --要导出的表名
@path nvarchar(1000),   --文件存放目录
@fname nvarchar(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=@tbname+'.xls'--检查文件是否已经存在
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.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES'
    +';DATABASE='+@sql+'"'
--连接数据库
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 goto lberrexec @err=sp_oamethod @obj,'open',null,@constr
if @err<>0 goto lberr/**//*--如果覆盖已经存在的表,就加上下面的语句
--创建之前先删除表/如果存在的话
select @sql='drop table ['+@tbname+']'
exec @err=sp_oamethod @obj,'execute',@out out,@sql
--*/--创建表的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 syscolumns a left join systypes b on a.xtype=b.xusertype
where b.name not in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')
 and object_id(@tbname)=id
select @sql='create table ['+@tbname
 +']('+substring(@sql,2,8000)+')'
 ,@fdlist=substring(@fdlist,2,8000)
exec @err=sp_oamethod @obj,'execute',@out out,@sql
if @err<>0 goto lberrexec @err=sp_oadestroy @obj--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;IMEX=1
   ;DATABASE='+@path+@fname+''',['+@tbname+'$])'exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from '+@tbname)returnlberr:
 exec sp_oageterrorinfo 0,@src out,@desc out
lbexit:
 select cast(@err as varbinary(4)) as 错误号
  ,@src as 错误源,@desc as 错误描述
 select @sql,@constr,@fdlist
go
 
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_exporttb]
GO/**//*--数据导出EXCEL
 
 导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件
 如果文件不存在,将自动创建文件
 如果表不存在,将自动创建表
 基于通用性考虑,仅支持导出标准数据类型--邹建 2003.10(引用请保留此信息)--*//**//*--调用示例 p_exporttb @sqlstr='select * from 地区资料'
  ,@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='temp.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.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES'
    +';DATABASE='+@sql+'"'--连接数据库
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 goto lberrexec @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 returnselect @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 lberrexec @err=sp_oadestroy @obj--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.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)
returnlberr:
 exec sp_oageterrorinfo 0,@src out,@desc out
lbexit:
 select cast(@err as varbinary(4)) as 错误号
  ,@src as 错误源,@desc as 错误描述
 select @sql,@constr,@fdlist
go
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wangdetian168/archive/2007/08/15/1744848.aspx

解决方案 »

  1.   

    http://topic.csdn.net/u/20100510/11/DA99F05D-A5ED-4AFA-B068-0D2B35CE024F.html
    12楼,看看那有没有关系 --数据库创建语句   
      set @sql=@path+@fname   
    if exists(select 1 from #tb where a=0) 
      set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'   
      +';CREATE_DB="'+@sql+'";DBQ='+@sql   
      else   
      set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 5.0;HDR=yes;IMEX=1;'   
      +';DATABASE='+@sql+'"'   
      

  2.   

    Funny that you are the second person this weekend to ask about this stored proc, I suspect you are having the same problem ChangeZ had in http://topic.csdn.net/u/20100520/22/e13f4f11-4bdc-439f-a35c-7c2fb77088ea.htmlSpecifically, you may want to try the version I created in that thread. If you can supply the exact error message the final version produces, then it would be quite easy to troubleshoot.
      

  3.   


    Post the exact error message and what outcome you expect. If the Excel file exists and sheet name also exists, an error is expected. However, it should continue running and append the data to the end of the sheet.
      

  4.   

    what outcome you expect》》》
    应该是outcoming 吧?觉得outcoming用在此很别扭!
      

  5.   


    outcome = 结果看不懂,用 translate.google.com 翻译可以凑合看。
      

  6.   

    Can you change your SQL Server output to text mode and paste a screenshot of the output.
      

  7.   

    csw200201我看了你在另一个类似问题里面的解决方案,我使用你最后修改的alter   proc   p_exporttb   
      @sqlstr   sysname, --查询语句,如果查询语句中使用了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='temp.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
      set @constr='Driver={Microsoft Excel Driver (*.xls)};Dbq='+@sql+';ReadOnly=0;'   
      else   
      set   @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES;DATABASE='+@sql+'"'   
        
      --连接数据库   
      exec   @err=sp_oacreate   'adodb.connection',@obj   out   
      if   @err<>0   begin print 'error creating adodb.connection object' goto   lberr end   
        
      exec   @err=sp_oamethod   @obj,'open',null,@constr   
      if   @err<>0   begin print 'error opening adodb.connection object' goto   lberr end  
        
      --创建表的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   in('char','nchar','varchar','nvarchar')   then   
        'text('+cast(case   when   a.length>255   then   255   else   a.length   end   as   varchar)+')'   
      when   b.name   in('tynyint','int','bigint','tinyint')   then   'int'   
      when   b.name   in('smalldatetime','datetime')   then   'datetime'   
      when   b.name   in('money','smallmoney')   then   'money'   
      else   b.name   end   
      FROM   tempdb..syscolumns   a   left   join   tempdb..systypes   b   on   a.xtype=b.xusertype   where   b.name   not   in
      ('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')   
      and   a.id=(select   id   from   tempdb..sysobjects   where   name=@tbname)   
      select   @sql='create   table   ['+@sheetname   +']('+substring(@sql,2,8000)+')' ,@fdlist=substring(@fdlist,2,8000)  
      --print @sql
      --print @fdlist 
      exec   @err=sp_oamethod   @obj,'execute',@out   out,@sql   
      if   @err<>0  
      begin 
        print 'error creating data sheet most likely sheet already alreayd exists'
      end   
      
        
      exec      @err=sp_oamethod    @obj, 'close'
      if @err<>0
      begin
        print 'error closing ADODB.Connection object'
      end
      exec   @err=sp_oadestroy   @obj   
        
      --导入数据   
      set   @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;DATABASE='+@path+@fname+''',['+@sheetname+'$])'   
        
      exec('insert   into   '+@sql+'('+@fdlist+')   select   '+@fdlist+'   from   ['+@tbname+']')   
        
      if @@error<>0 begin print 'error inserting detailed records' end    
      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   
      go运行存储过程修改的时候,提示“错误170,第18行(附近有语法错误”
      

  8.   

    >>运行存储过程修改的时候,提示“错误170,第18行(附近有语法错误”<<This is bizzare. Can you paste here the actual sql statement you are executing. BTW, which version of SQL Server are you running? It is not SQL Server 6.5, is it??
      

  9.   

    是 sql server 2000,我输入你的代码,点击确定的时候出现以上提示,语法检查的时候没有错误的!!