我需要通过作业代理执行存储过程,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)。步骤失败了。
感谢所有回复。