访问' Microsoft.ACE.OLEDB.12.0'来自SQL Job Agent

时间:2016-08-31 08:25:35

标签: sql-server excel

我需要通过作业代理执行存储过程,sp连接到' Microsoft.ACE.OLEDB.12.0'并从excel表中获取数据。 当我执行sp时,它的工作。但是当由工作代理执行它时它不起作用。 我的代码在这里: 首先,我写了一个返回值程序来获取Excel工作表名称:

ALTER PROCEDURE [dbo].[spExcelSheetName]
@TableName nvarchar(250) output

AS

declare @table Table (TABLE_CAT nvarchar(50), TABLE_SCHEM nvarchar(50), TABLE_NAME nvarchar(50), TABLE_TYPE nvarchar(50), REMARKS nvarchar(50))
insert into @table
    EXECUTE SP_TABLES_EX 'ExcelSource';
select @TableName = TABLE_NAME from @table

然后用sp从excel表中获取数据并插入到我的sql表中:

ALTER PROCEDURE [dbo].[spConvertExcel]

AS
begin
IF EXISTS(SELECT * FROM sys.servers WHERE name = N'ExcelSource')
    EXEC master.sys.sp_dropserver 'ExcelSource','droplogins'  

EXEC sp_addlinkedserver 'ExcelSource', '',
   'Microsoft.ACE.OLEDB.12.0',
   'D:\Test\Personel.xlsx',
   NULL,
   'Excel 8.0'
EXEC sp_addlinkedsrvlogin 'ExcelSource', 'false'
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1   

declare @SheetName nvarchar(250)
exec spExcelSheetName @TableName = @SheetName OUTPUT

declare @Query nvarchar(max)
set @Query = 
N'SELECT *
FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',
  ''Excel 12.0 Xml; HDR=YES;Database=D:\Test\Personel.xlsx'',
   ['+@SheetName+']);'

delete from ExcelPersonels
insert into ExcelPersonels
    exec sp_executesql @Query;

delete from Personels 
where personelcode in (select personelcode from ExcelPersonels)

update Personels set IsActive = 0

insert into Personels
    select *, 1 from ExcelPersonels

end

这个sp运行没有任何问题,但是当我想通过Job代理运行它时它不起作用:( 作业代码是:exec(spConvertExcel) 甚至我试过:osql -E -Q“exec spConvertExcel” 但它也没有用。

错误按摩是: 信息 以用户身份执行:NT SERVICE \ SQLAgent $ SQL2014。无法初始化OLE DB提供程序的数据源对象" Microsoft.ACE.OLEDB.12.0"对于链接服务器" ExcelSource"。 [SQLSTATE 42000](错误7303)OLE DB提供程序" Microsoft.ACE.OLEDB.12.0"对于链接服务器" ExcelSource"返回消息"未指定错误"。 [SQLSTATE 01000](错误7412)。步骤失败了。

感谢所有回复。

0 个答案:

没有答案