/*
** Import an excel file into a table
*/
create proc IMP_XLS 
@file_addr varchar(255),
@sheet_name varchar (255),
@table_name varchar(255) 
as
SELECT * INTO @table_name FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=@file_addr;Extended Properties=Excel 8.0')...[@sheet_name$]
GO
以上运行有问题,报错:
服务器: 消息 7314,级别 16,状态 1,过程 IMP_XLS,行 6
OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 不包含表 '@sheet_name$'。该表可能不存在,或当前用户没有使用该表的权限。但
SELECT * INTO XLImport3 FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=D:\test.xls;Extended Properties=Excel 8.0')...[sheet1$]
可以被正常运行。请大家给点意见

解决方案 »

  1.   

    --try:
    create proc IMP_XLS 
    @file_addr varchar(255),
    @sheet_name varchar (255),
    @table_name varchar(255) 
    as
    declare @sql varchar(1000)
    set @sql='SELECT * INTO @table_name FROM OPENDATASOURCE(''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source=@file_addr;Extended Properties=Excel 8.0'')...['+@sheet_name+'$]'
    exec(@sql)GO
      

  2.   

    --try:
    create proc IMP_XLS 
    @file_addr varchar(255),
    @sheet_name varchar (255),
    @table_name varchar(255) 
    as
    declare @sql varchar(1000)
    set @sql='SELECT * INTO '+@table_name+' FROM OPENDATASOURCE(''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source='+@file_addr+';Extended Properties=Excel 8.0'')...['+@sheet_name+'$]'
    exec(@sql)GO
      

  3.   

    --trycreate proc IMP_XLS 
    @file_addr varchar(255),
    @sheet_name varchar (255),
    @table_name varchar(255) 
    asdeclare @sql varchar(8000)set @sql ='SELECT * INTO [' + @table_name + '] FROM OPENDATASOURCE(''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source=' + @file_addr + ';Extended Properties=Excel 8.0'')...[' + @sheet_name + '$]'
    print @sqlexec (@sql)GO
      

  4.   

    create proc IMP_XLS
    @file_addr varchar(255),
    @sheet_name varchar (255),
    @table_name varchar(255)
    as
    EXEC ('SELECT * INTO '+@table_name+' FROM OPENDATASOURCE(''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source='+@file_addr+';Extended Properties=Excel 8.0'')...['+@sheet_name+'$]')
      

  5.   


    动态sql语句基本语法 
    1 :普通SQL语句可以用Exec执行 eg:   Select * from tableName 
             Exec('select * from tableName') 
             Exec sp_executesql N'select * from tableName'    -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg:   
    declare @fname varchar(20) 
    set @fname = 'FiledName' 
    Select @fname from tableName              -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
    Exec('select ' + @fname + ' from tableName')     -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可 
    declare @fname varchar(20) 
    set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s)                -- 成功 
    exec sp_executesql @s   -- 此句会报错 declare @s Nvarchar(1000)  -- 注意此处改为nvarchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s)                -- 成功     
    exec sp_executesql @s   -- 此句正确 3. 输出参数 
    declare @num int, 
            @sql nvarchar(4000) 
    set @sql='select count(*) from tableName' 
    exec(@sql) 
    --如何将exec执行结果放入变量中? declare @num int, @sql nvarchar(4000) 
    set @sql='select @a=count(*) from tableName ' 
    exec sp_executesql @sql,N'@a int output',@num output 
    select @num 
      

  6.   

    可以创建 procedure了,但怎么运行呢?exec IMP_XLS 'D:/1.xls','sheet1','#test'通不过:
    服务器: 消息 170,级别 15,状态 1,行 1
    第 1 行: '@table_name' 附近有语法错误。
      

  7.   

    --应该是\,不是/exec IMP_XLS 'D:\1.xls','sheet1','#test'
      

  8.   

    --这个绝对没错
    create proc IMP_XLS
    @file_addr varchar(255),
    @sheet_name varchar (255),
    @table_name varchar(255)
    as
    EXEC ('SELECT * INTO '+@table_name+' FROM OPENDATASOURCE(''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source='+@file_addr+';Extended Properties=Excel 8.0'')...['+@sheet_name+'$]')
      

  9.   

    用临时表'#test',是不行的,运行完存储过程#test就没了,访问不到。用全局临时表或实际表
      

  10.   

    如果在存储过程中,先创建静态临时表#test,可以通过动态SQL语句追加到#test,在存储过程的追加语句后面,可以直接访问#test