邹建等大哥,来看看吧!
我用一台SQL-SERVER同局域网内另一台ACCESS做链接服务器,实现分布查询,使得ACCESS里增加的数据同时增加到SQL-SERVER里去。
我的SQL语句在查询分析器里没问题,但是写成存储过程在作业里调就出问题了。
if exists(select * from 测试数据库..渗压)
begin
--SQL-SERVER里有记录,则取出最大时间,并把ACCESS里比这个时间大的所有记录取出来
select top 1 @NewestDateTime=SurveyDateTime
from 测试数据库..渗压
order by SurveyDateTime desc
insert into 测试数据库..渗压(SurveyPointNo,SurveyDateTime,MiddleValue1)
select SurveyPointNo,(datename(year,SurveyDate)+'-'+datename(month,SurveyDate)+'-'+datename(day,SurveyDate)+' ' +datename(hour,SurveyTime)+':'+datename(minute,SurveyTime)+':'+datename(second,SurveyTime)) as TempSurveyDateTime,cast(MiddleValue1 as float) as MiddleValue1 from FromML...A11Czzk1 as A
where (datename(year,SurveyDate)+'-'+datename(month,SurveyDate)+'-'+datename(day,SurveyDate)+' ' +datename(hour,SurveyTime)+':'+datename(minute,SurveyTime)+':'+datename(second,SurveyTime)) > @NewestDateTime
end
else begin
--SQL-SERVER里没有记录,则把ACCESS里所有记录都取出来
insert into 测试数据库..渗压(SurveyPointNo,SurveyDateTime,MiddleValue1)
select SurveyPointNo,(datename(year,SurveyDate)+'-'+datename(month,SurveyDate)+'-'+datename(day,SurveyDate)+' ' +datename(hour,SurveyTime)+':'+datename(minute,SurveyTime)+':'+datename(second,SurveyTime)) as TempSurveyDateTime,cast(MiddleValue1 as float) as MiddleValue1 from FromML...A11Czzk1 as A
end
很奇怪的问题,作业是sqlagent服务调用的,而查询分析器里的代码是mssql服务调用的,为什么错了呢?错误代码是:
执行用户: GAO\Administrator。OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 报错。 [SQLSTATE 42000](错误 7399) [SQLSTATE 01000](错误 7312) OLE DB 错误跟踪[OLE/DB Provider 'Microsoft.Jet.OLEDB.4.0' IDBInitialize::Initialize returned 0x80004005: ]。 [SQLSTATE 01000](错误 7300). 步骤失败。
问题是sqlagent的登陆名和mssql的登陆名都是administrator,为什么呢?
急啊!
而且这方面资料也不是很多.
救命!
问题点数:100、回复次数:26Top
1 楼loveghb(温柔的毒药)回复于 2005-09-30 10:00:33 得分 0
哎,为什么呢?大家说说吧,有谁遇到过此类问题?指条道吧!
Top
2 楼vivianfdlpw()回复于 2005-09-30 10:17:21 得分 10
该错误一般属于连接超时错误,确认你服务名,用户名,密码正确,另外设置超时时间大一点Top
3 楼vivianfdlpw()回复于 2005-09-30 10:19:18 得分 5
还有服务器的防火墙设置等因素也可能导致超时Top
4 楼loveghb(温柔的毒药)回复于 2005-09-30 10:20:09 得分 0
你说的服务名,用户名,密码是指什么呢?
问题是这个存储过程原封不动在查询分析器里就可以。作业里就不可以?
跟你说的"服务名,用户名,密码"没关系吧?
而且不是超时的问题,那个错误应该是SQL-SERVER没法打开远程的ACCESS
我的作业的代码如下,应该没什么问题:
-- 2005-9-30/10:20 上生成的脚本
-- 由: GAO\Administrator
-- 服务器: GAO
BEGIN TRANSACTION
DECLARE @JobID BINARY(16)
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]') < 1
EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]'
-- 删除同名的警报(如果有的话)。
SELECT @JobID = job_id
FROM msdb.dbo.sysjobs
WHERE (name = N'job1')
IF (@JobID IS NOT NULL)
BEGIN
-- 检查此作业是否为多重服务器作业
IF (EXISTS (SELECT *
FROM msdb.dbo.sysjobservers
WHERE (job_id = @JobID) AND (server_id <> 0)))
BEGIN
-- 已经存在,因而终止脚本
RAISERROR (N'无法导入作业“job1”,因为已经有相同名称的多重服务器作业。', 16, 1)
GOTO QuitWithRollback
END
ELSE
-- 删除[本地]作业
EXECUTE msdb.dbo.sp_delete_job @job_name = N'job1'
SELECT @JobID = NULL
END
BEGIN
-- 添加作业
EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , @job_name = N'job1', @owner_login_name = N'GAO\Administrator', @description = N'没有可用的描述。', @category_name = N'[Uncategorized (Local)]', @enabled = 1, @notify_level_email = 0, @notify_level_page = 0, @notify_level_netsend = 0, @notify_level_eventlog = 2, @delete_level= 0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- 添加作业步骤
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 1, @step_name = N'step1', @command = N'exec 测试数据库..UpdateNewRecord', @database_name = N'master', @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 1, @on_fail_step_id = 0, @on_fail_action = 2
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- 添加作业调度
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N'diaodu1', @enabled = 1, @freq_type = 4, @active_start_date = 20050929, @active_start_time = 0, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 3, @freq_relative_interval = 0, @freq_recurrence_factor = 0, @active_end_date = 99991231, @active_end_time = 235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- 添加目标服务器
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
Top
5 楼loveghb(温柔的毒药)回复于 2005-09-30 10:21:08 得分 0
TO:vivianfdlpw()
假如你说的是正确的,那我该什么设置呢?
在哪里设置?我比较菜,能否详细说明?
Top
6 楼swordlee2000(啊菜)回复于 2005-09-30 10:46:29 得分 5
看不懂,帮顶~~:(Top
7 楼vivianfdlpw()回复于 2005-09-30 10:52:08 得分 10
确认SQL Server Agent以非本地(LocalSystem)的管理员帐户登录
Top
8 楼loveghb(温柔的毒药)回复于 2005-09-30 10:56:13 得分 0
我是用administrator的。sqlagent和sqlserver这2个服务都是用administrator登陆的。
Top
9 楼loveghb(温柔的毒药)回复于 2005-09-30 10:58:04 得分 0
此作业也是属于administrator的。LocalSystem会导致访问不了远程ACCESS,这个我知道。
但是现在作业出错信息似乎就是访问不了远程ACCESS导致的。
问题是我已经都改过来了。在查询分析器里执行此存储过程一点问题都没!
郁闷!
一点进展都没!!!Top
10 楼loveghb(温柔的毒药)回复于 2005-09-30 11:07:49 得分 0
顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Top
11 楼yesyesyes()回复于 2005-09-30 11:14:24 得分 10
把access升迁到sqlserver
从access的adp直接操作sqlserver
没那么多麻烦事Top
12 楼vivianfdlpw()回复于 2005-09-30 11:20:55 得分 10
满怪的,试试:
重新启动代理服务
关掉网络防火墙和病毒防火墙
在链接服务器属性设置里设置超时时间为0
安装最新补丁及MDAC组件
Top
13 楼CrazyFor(冬眠的鼹鼠)回复于 2005-09-30 11:24:43 得分 10
你的SQL SERVER是不是设置成混合登录模式?Top
14 楼loveghb(温柔的毒药)回复于 2005-09-30 11:26:30 得分 0
为什么一定要用这种方法而不用写程序或者升迁到SQL-SERVER是有原因的,现在就是要这么做。
哎,郁闷喽
Top
15 楼loveghb(温柔的毒药)回复于 2005-09-30 12:21:13 得分 0
设置成"仅WINDOWS"或者"SQL-SERVER和WINDOWS"都不行的。
我试过了
Top
16 楼zjcxc(邹建)回复于 2005-09-30 12:26:34 得分 5
访问ACCESS数据库的链接服务器怎么配置的? 帖出来看看Top
17 楼loveghb(温柔的毒药)回复于 2005-09-30 13:13:30 得分 0
映射网络上的一个共享目录为本地的一个驱动器,然后分别执行下面两句SQL语句:
sp_addlinkedserver 'FromML', 'Access 2000', 'Microsoft.Jet.OLEDB.4.0', 'z:\online.mdb'
sp_addlinkedsrvlogin 'FromML', false, 'sa', 'admin', NULL
ACCESS文件就在那个共享目录里,并且目录设置成EVERYONE可以读取.
SQL-SERVER端的MSSQL服务登陆用户改成administrator,SQLAGENT服务的登陆名也改成administrator
这样就建立了一个ACCESS的链接了,我可以在本地做如下类似查询:
Select * from FromML...seltmp
测试没问题.
如下是我真正要做的事情,SQL语句如下,用来把ACCESS里新的数据插入到SQL的一个表中去.
declare @NewestDateTime as datetime
if exists(select * from 测试数据库..渗压)
begin
--SQL-SERVER里有记录,则取出最大时间,并把ACCESS里比这个时间大的所有记录取出来
select top 1 @NewestDateTime=SurveyDateTime
from 测试数据库..渗压
order by SurveyDateTime desc
insert into 测试数据库..渗压(SurveyPointNo,SurveyDateTime,MiddleValue1)
select SurveyPointNo,(datename(year,SurveyDate)+'-'+datename(month,SurveyDate)+'-'+datename(day,SurveyDate)+' ' +datename(hour,SurveyTime)+':'+datename(minute,SurveyTime)+':'+datename(second,SurveyTime)) as TempSurveyDateTime,cast(MiddleValue1 as float) as MiddleValue1 from FromML...A11Czzk1 as A
where (datename(year,SurveyDate)+'-'+datename(month,SurveyDate)+'-'+datename(day,SurveyDate)+' ' +datename(hour,SurveyTime)+':'+datename(minute,SurveyTime)+':'+datename(second,SurveyTime)) > @NewestDateTime
end
else begin
--SQL-SERVER里没有记录,则把ACCESS里所有记录都取出来
insert into 测试数据库..渗压(SurveyPointNo,SurveyDateTime,MiddleValue1)
select SurveyPointNo,(datename(year,SurveyDate)+'-'+datename(month,SurveyDate)+'-'+datename(day,SurveyDate)+' ' +datename(hour,SurveyTime)+':'+datename(minute,SurveyTime)+':'+datename(second,SurveyTime)) as TempSurveyDateTime,cast(MiddleValue1 as float) as MiddleValue1 from FromML...A11Czzk1 as A
end
在查询分析器里可以执行,但是我要每3分钟执行一次,所以我把上面的东西写成存储过程,并用作业去调用它,出错,我直接把SQL语句写在作业里,也出错.
我在查询分析器里执行SQL语句,正确.我在查询分析器里执行存储过程,正确。
作业出错信息如下:
执行用户: GAO\ad。OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 报错。 [SQLSTATE 42000](错误 7399) [SQLSTATE 01000](错误 7312) OLE DB 错误跟踪[OLE/DB Provider 'Microsoft.Jet.OLEDB.4.0' IDBInitialize::Initialize returned 0x80004005: ]。 [SQLSTATE 01000](错误 7300). 步骤失败。Top
18 楼loveghb(温柔的毒药)回复于 2005-09-30 13:18:56 得分 0
SQL-SERVER是用本地帐户登陆,SA登录是不行的,SQLSERVER和SQLAGENT这2个服务的登陆用户不能是SYSTEM,否则出错.ACCESS所在文件夹包括MDB文件本身一定要是可访问并可读取的,否则出错.
这些我都一点点摸索出来的。
本来以为离成功就很近,结果.
一筹莫展,错误意思似乎是OLEDB去打开远程ACCESS文件就出错了。
估计没访问权限?
奇怪了。查询分析器里就可以,查询分析器是调用MSSQL服务的,作业是调用MSAGENT服务的,难道MSSQL服务可以,MSAGENT服务就不可以?
怪哉怪哉!
邹建大哥,看到你我就看到希望了。
Top
19 楼loveghb(温柔的毒药)回复于 2005-09-30 13:54:27 得分 0
:(
希望,你怎么不来了呢?
Top
20 楼duoluohuifeng(堕落回风)回复于 2005-09-30 17:06:02 得分 5
帮定Top
21 楼vivianfdlpw()回复于 2005-09-30 17:19:06 得分 10
sp_addlinkedsrvlogin 'FromML', false, 'sa', 'admin', NULL
==========>
改为sp_addlinkedsrvlogin 'FromML', false, null, 'admin', NULL试试Top
22 楼loveghb(温柔的毒药)回复于 2005-09-30 19:21:16 得分 0
谢谢vivianfdlpw()一直对此贴的关心,现在放假了。
我10.1以后马上回公司试一下。如果再不行就放弃,换成在ACCESS端写个服务程序算了。
Top
23 楼sxycgxj(云中客)回复于 2005-09-30 19:57:49 得分 5
主要与防火墙和远程服务器的登录方式有关,
希望楼主解决了问题后,能与大家分享下Top
24 楼lisiyong(小样)回复于 2005-09-30 22:12:02 得分 5
同意楼上的Top
25 楼w3k(网络3K)回复于 2005-09-30 22:25:05 得分 5
upTop
26 楼prcgolf(小鸟)回复于 2005-10-09 10:20:28 得分 5
upTop




