我用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$'。该表可能不存在,或当前用户没有使用该表的权限。
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$'。该表可能不存在,或当前用户没有使用该表的权限。
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
格式是这样的应该..
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$]
')
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' 附近有语法错误。
@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
这样不就是比我原来的个exec('')吗?
它还是会报:
必须声明变量 '@@tabName1'。
必须声明变量 '@@tabName2'。
@tabName2和@@tabName2是不同的, 前者是局部變量, 後者是全局變量
必须声明变量 '@tabName1'。
必须声明变量 '@tabName2'。
@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
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)
'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