CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

邹建等大哥,来看看吧!

楼主loveghb(温柔的毒药)2005-09-30 09:56:20 在 MS-SQL Server / 基础类 提问

我用一台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

相关问题

  • 邹建大哥,请进!
  • 邹建大哥来拿分!
  • 邹建大哥帮忙?
  • 请邹建大哥帮忙
  • 邹建大哥,请进来!急~~
  • 邹建大哥再进来看看~~
  • zjcxc(邹建)大哥幫幫忙啊!
  • 请[邹建]大哥再帮个忙!
  • 邹建大哥.请教关于交叉表的问题
  • 请邹建大哥帮忙,目录树复制效率问题!!

关键词

  • sql-server
  • access
  • 数据库
  • 服务器
  • 作业
  • 测试
  • 查询
  • 密码
  • 用户
  • db

得分解答快速导航

  • 帖主:loveghb
  • vivianfdlpw
  • vivianfdlpw
  • swordlee2000
  • vivianfdlpw
  • yesyesyes
  • vivianfdlpw
  • CrazyFor
  • zjcxc
  • duoluohuifeng
  • vivianfdlpw
  • sxycgxj
  • lisiyong
  • w3k
  • prcgolf

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo