我用SQL导入Execl表:
CREATE PROCEDURE pro_import 
@tabName1 nchar(50), 
@tabName2 nchar(50)
AS
IF EXISTS(SELECT name 
  FROM   sysobjects 
  WHERE  name = N'temPeishong' 
  AND   type = 'U')
     DROP TABLE temPeishong  --删除原表
GO
SELECT identity(int ,1,1) as SN,单位名称,货号,品名,规格,数量,单位,零售总额,开单日期
into temPeishong
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source=@tabName1;User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]
-----------------------------------------------------------
IF EXISTS(SELECT name 
  FROM   sysobjects 
  WHERE  name = N'temPeishong' 
  AND   type = 'U')
     DROP TABLE temPeishong  --删除原表
GO
-- ============================================
--销售出库明细表批发查询表(temPifa)
SELECT identity(int ,1,1) as SN,单位名称,货号,品名,规格,数量,单位,未结算价税,开单日期
into temPifa
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source=@tabName2;User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]GO为什么会报这样的错呢?我执行时也没有打开这个Execl表
服务器: 消息 7314,级别 16,状态 1,行 1
OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 不包含表 'Sheet1$'。该表可能不存在,或当前用户没有使用该表的权限。
服务器: 消息 7314,级别 16,状态 1,行 3
OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 不包含表 'Sheet1$'。该表可能不存在,或当前用户没有使用该表的权限。

解决方案 »

  1.   

    SELECT * 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
    格式是这样的应该..
      

  2.   

    汗, 能這樣使用變量@tabName2嗎?
      

  3.   

    --改成動態SQL 試試 exec('
    SELECT identity(int ,1,1) as SN,单位名称,货号,品名,规格,数量,单位,零售总额,开单日期
    into temPeishong
    FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source='+@tabName1+';User ID=Admin;Password=;Extended properties=Excel 5.0'')...[Sheet1$]
    ')
      

  4.   

    IF EXISTS (SELECT name 
       FROM   sysobjects 
       WHERE  name = N'pro_import' 
       AND    type = 'P')
        DROP PROCEDURE pro_import
    GOCREATE PROCEDURE pro_import 
    @tabName1 nchar(50), 
    @tabName2 nchar(50)
    AS
    IF EXISTS(SELECT name 
      FROM   sysobjects 
      WHERE  name = N'temPeishong' 
      AND   type = 'U')
         DROP TABLE temPeishong  --删除原表
    GO

    SELECT identity(int ,1,1) as SN,单位名称,货号,品名,规格,数量,单位,零售总额,开单日期
    into temPeishong
    FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source='+@tabName1+';User ID=Admin;Password=;Extended properties=Excel 5.0'')...[Sheet1$]

    -----------------------------------------------------------
    IF EXISTS(SELECT name 
      FROM   sysobjects 
      WHERE  name = N'temPeishong' 
      AND   type = 'U')
         DROP TABLE temPeishong  --删除原表
    GO
    -- ============================================
    --销售出库明细表批发查询表(temPifa)

    SELECT identity(int ,1,1) as SN,单位名称,货号,品名,规格,数量,单位,未结算价税,开单日期
    into temPifa
    FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source='+@tabName2+';User ID=Admin;Password=;Extended properties=Excel 5.0'')...[Sheet1$]

    GO我这样写了还是报错:
    服务器: 消息 170,级别 15,状态 1,行 4
    第 4 行: 'Microsoft' 附近有语法错误。
    服务器: 消息 170,级别 15,状态 1,行 6
    第 6 行: 'Microsoft' 附近有语法错误。
      

  5.   

    --tryCREATE PROCEDURE pro_import 
    @tabName1 nchar(50), 
    @tabName2 nchar(50)
    AS
    IF EXISTS(SELECT name 
      FROM   sysobjects 
      WHERE  name = N'temPeishong' 
      AND   type = 'U')
         DROP TABLE temPeishong  --删除原表
    GO
    exec('
    SELECT identity(int ,1,1) as SN,单位名称,货号,品名,规格,数量,单位,零售总额,开单日期
    into temPeishong
    FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source='+@tabName1+';User ID=Admin;Password=;Extended properties=Excel 5.0'')...[Sheet1$]
    ')
    -----------------------------------------------------------
    IF EXISTS(SELECT name 
      FROM   sysobjects 
      WHERE  name = N'temPeishong' 
      AND   type = 'U')
         DROP TABLE temPeishong  --删除原表
    GO
    -- ============================================
    --销售出库明细表批发查询表(temPifa)
    exec('
    SELECT identity(int ,1,1) as SN,单位名称,货号,品名,规格,数量,单位,未结算价税,开单日期
    into temPifa
    FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source='+@tabName2+';User ID=Admin;Password=;Extended properties=Excel 5.0'')...[Sheet1$]
    ')GO
      

  6.   


    这样不就是比我原来的个exec('')吗?
    它还是会报:
    必须声明变量 '@@tabName1'。
    必须声明变量 '@@tabName2'。
      

  7.   

    '@@tabName1', '@@tabName2'哪裏來的?
    @tabName2和@@tabName2是不同的, 前者是局部變量, 後者是全局變量
      

  8.   

    呵呵,是我复制错了,报的错是:
    必须声明变量 '@tabName1'。
    必须声明变量 '@tabName2'。
      

  9.   

    --tryCREATE PROCEDURE pro_import 
    @tabName1 nchar(50), 
    @tabName2 nchar(50)
    AS
    IF EXISTS(SELECT name 
      FROM  sysobjects 
      WHERE  name = N'temPeishong' 
      AND  type = 'U')
        DROP TABLE temPeishong  --删除原表
    --GO
    exec('
    SELECT identity(int ,1,1) as SN,单位名称,货号,品名,规格,数量,单位,零售总额,开单日期
    into temPeishong
    FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source='+@tabName1+';User ID=Admin;Password=;Extended properties=Excel 5.0'')...[Sheet1$]
    ')
    -----------------------------------------------------------
    IF EXISTS(SELECT name 
      FROM  sysobjects 
      WHERE  name = N'temPeishong' 
      AND  type = 'U')
        DROP TABLE temPeishong  --删除原表
    --GO
    -- ============================================
    --销售出库明细表批发查询表(temPifa)
    exec('
    SELECT identity(int ,1,1) as SN,单位名称,货号,品名,规格,数量,单位,未结算价税,开单日期
    into temPifa
    FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source='+@tabName2+';User ID=Admin;Password=;Extended properties=Excel 5.0'')...[Sheet1$]
    ')GO
      

  10.   

    楼主改为如下代码是可以的
    declare @a varchar(10),@sql varchar(1000)
    set @a='e:\a.xls'
    set @sql='select * ,'+'identity(int ,1,1) as SN '
    +'into test_T'
    +' FROM openrowset( '+'''Microsoft.Jet.OLEDB.4.0'''+
    ',''EXCEL 8.0;HDR=YES;IMEX=1; DATABASE='+@a+''',sheet1$)as roy'
    --print @sqlexec(@sql)
      

  11.   

    2005才支持调用变量,2000及以下版本需要用exec,exec sp_executesql
      

  12.   

    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source=@tabName2;User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]
    楼主的这一段问题出在变量@tabName2
    正确用法如下:
    --如何将exec执行结果放入变量中? declare @num int, 
                   @sqls nvarchar(4000) 
    set @sqls='select @a=count(*) from tableName ' 
    exec sp_executesql @sqls,N'@a int output',@num output 
    select @num 
    --------------------------------------------------------------------------------动态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, 
            @sqls nvarchar(4000) 
    set @sqls='select count(*) from tableName' 
    exec(@sqls) 
    --如何将exec执行结果放入变量中? declare @num int, 
                   @sqls nvarchar(4000) 
    set @sqls='select @a=count(*) from tableName ' 
    exec sp_executesql @sqls,N'@a int output',@num output 
    select @num