用连接服务器来做:1) EXEC sp_addlinkedserver 
   'Bserver', --名称
   '', 
   'MSDASQL',
   NULL,
   NULL,
   'DRIVER={SQL Server};SERVER=B服务器名;UID=sa;PWD=密码;'
GO
---添加连接服务器exec sp_addlinkedsrvlogin 'Bserver','false','本地用户名','远程服务器用户名','密码'
select * from  Bserver.test.dbo.表1
2) CREATE procedure sp_sendmail
with recompile
as 
 
SET XACT_ABORT ON    
SET ANSI_NULL_DFLT_ON ON
SET ANSI_WARNINGS ON declare
     @midept char(5),
     @modept  char(5),
     @mail    varchar(30),
     @msql   varchar(1000),
     @mstatus  tinyint,
     @memo     varchar(300),
     @msubject varchar(30)set @mail='[email protected]'
select @msql='select * from  Bserver.test.dbo.表1'select @memo='每天查询的数据'+convert(char(10),getdate(),102)
select @msubject='每天数据报表'
exec @mstatus=master..xp_sendmail @recipients=@mail,
                                          @message=@memo,
                                          @subject=@msubject,
                                          @width=800, 
                                          @query=@msql
CREATE procedure sp_sendmail
with recompile
as 
 
SET XACT_ABORT ON    
SET ANSI_NULL_DFLT_ON ON
SET ANSI_WARNINGS ON declare
     @midept char(5),
     @modept  char(5),
     @mail    varchar(30),
     @msql   varchar(1000),
     @mstatus  tinyint,
     @memo     varchar(300),
     @msubject varchar(30)set @mail='[email protected]'
select @msql='SELECT a.* FROM OPENROWSET(''MSDASQL'',
   ''DRIVER={SQL Server};SERVER=B;UID=sa;PWD=sa'',
   test.dbo.表1) AS a'select @memo='每天查询的数据'+convert(char(10),getdate(),102)
select @msubject='每天数据报表'
exec @mstatus=master..xp_sendmail @recipients=@mail,
                                          @message=@memo,
                                          @subject=@msubject,
                                          @width=800, 
                                          @query=@msql
SELECT a.*
FROM OPENROWSET('MSDASQL',
   'DRIVER={SQL Server};SERVER=B;UID=sa;PWD=sa',
   test.dbo.表1) AS a3)做一个job定期调用sp_sendmail

解决方案 »

  1.   


    如何配置mail1.使用  MSSQLServer  服务会用到的用户帐户登录到  Microsoft  Windows  NT®  4.0  或  Windows®  2000  上。该用户帐户必须是本地计算机的管理员和域帐户。  
    2.确认  Exchange  Server  客户端  (Exchnge32.exe)  或  Microsoft  Outlook™  客户端  (Outlook.exe)  能够连接到  Exchange  Server  而且能够发送电子邮件。如果使用  Outlook,确保  Outlook  安装时选择了  "用于企业或工作组  "选项。  
    3.确认所用的  Exchange  Server  配置文件中没有个人消息存储  (.pst)。Exchange  Server  配置文件的名字不应超过  32  个字符。  
    4.在  "服务  "选项卡上,确认  Microsoft  Exchange  Server  和个人通讯簿是唯一可用的服务,然后单击  "发送  "选项卡。确认  "发送到  "框中选定的内容是  Exchange  Server  中的邮箱,它应该有一个类似于  "邮箱  -  <友好的用户名  >  "的名字(其中  <友好的用户名  >是在第一步中登录到  Windows  NT  4.0  或  Windows  2000  的用户名)。  
    5.要运行带有  Exchange  Server  的  "SQL  邮件  ",MSSQLServer  服务必须在第一步中登录的同一个用户帐户下运行。在  "控制面板  "中,双击  "服务  ",选择  MSSQLServer  服务,然后单击  "启动  "。  
    6.确认  "SQL  邮件  "的配置文件是否正确。在  SQL  Server  企业管理器中,展开服务器,展开  "支持服务  "文件夹,选择  "SQL  邮件  ",然后用右键单击。单击  "属性  ",然后在  "常规  "选项卡上,确保  "配置文件名  "框中指定的配置文件名正确。(事件探查器名必须与第三步中用到的配置文件名匹配。)单击  "测试  ",验证配置文件设置正确。  
    7.如果  "SQL  邮件  "无法启动(例如,显示错误信息指出配置文件不正确),请检查设置确保未将  Outlook  Express  设置为默认的电子邮件客户程序。在  "控制面板  "中双击  "Internet  "选项。在  "程序  "选项卡中,验证  Outlook  Express  不在电子邮件组合框中。如果不得不将默认的电子邮件客户程序更改为  Outlook  Express  以外的客户程序,那么,可能需要先验证  "SQL  邮件  "能够用邮件配置文件启动,然后再停止并重新启动  MSSQLServer  服务。    
    在有些情况下,邮件的配置文件可能会损坏而且  "SQL  邮件  "将无法使用它。要更正这个问题,需要把配置文件复制到另一个文件名下,或重新创建配置文件。  
    8.如果用来启动  Microsoft  SQL  Server&#8482;  的帐户没有权限访问  Exchange  服务器,那么就无法使用  "SQL  邮件  "。执行  xp_cmdshell  来测试  SQL  Server  对  Exchange  Server  的访问权限,它执行与  "SQL  邮件  "相同的权限。使用下面的命令测试对服务器的连接,假定  Exchange  Server  位于名为  "MyServer  "的计算机上。  
     
    xp_cmdshell    "NET  USE  \\MyServer\IPC$  "  
     
    如果这个命令无法正常执行,说明第三步未正确完成。
    --添加jobEXEC sp_add_job @job_name = 'test'
    EXEC sp_add_jobstep @job_name = 'test',
       @step_name = 'test_1',
       @subsystem = 'TSQL',
       @command = 'exec sp_sendmail', /*这是你每次想执行的东西*/
       @retry_attempts = 5,
       @retry_interval = 5
    EXEC sp_add_jobschedule @job_name = 'test', 
       @name = 'Schedule_test',
       @freq_type = 16, -- daily
       @freq_interval = 26,
       @active_start_time = 10000sp_add_jobschedule    
    @job_id  =  @JobID,    
    @name  =  N'ff',    
    @enabled  =  1,    
    @freq_type  =  4,  --每天  
    @active_start_date  =  20030611,  --开始日期  
    @active_start_time  =  0,  --开始时刻  
    @freq_interval  =  1,  --子周期  
    @freq_subday_type  =  8,  --单位是小时  
    @freq_subday_interval  =  10,  --10小时  
    @freq_relative_interval  =  0,    
    @freq_recurrence_factor  =  0,    
    @active_end_date  =  99991231,  
    @active_end_time  =  235959EXEC sp_add_job @job_name = '作业名字'
    EXEC sp_add_jobstep @job_name = '作业名字',
       @step_name = '步骤名子',
       @subsystem = 'TSQL',
       @command = 'EXEC master..xp_cmdshell ''c:\你的exe文件''', 
       @retry_attempts = 5, --重试次数
       @retry_interval = 5  --重试间隔EXEC sp_add_jobschedule @job_name = '作业名字', 
       @name = '作业调度名字',
       @freq_type = 4, -- 每天
       @freq_interval = 26, --间隔
       @active_start_time = 10000 --开始时间
    EXEC sp_add_job @job_name = 'test'
    EXEC sp_add_jobstep @job_name = 'test',
       @step_name = 'test_1',
       @subsystem = 'TSQL',
       @command = 'update yourtable set yourcol=0', /*这是你每次想执行的东西*/
       @retry_attempts = 5,
       @retry_interval = 5
    EXEC sp_add_jobschedule @job_name = 'test', 
       @name = 'Schedule_test',
       @freq_type = 16, -- daily
       @freq_interval = 26,
       @active_start_time = 10000
    EGIN 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'taskname')       
      IF (@JobID IS NOT NULL)    
      BEGIN  
      -- 检查此作业是否为多重服务器作业  
      IF (EXISTS (SELECT  * 
                  FROM    msdb.dbo.sysjobservers 
                  WHERE   (job_id = @JobID) AND (server_id <> 0))) 
      BEGIN 
        -- 已经存在,因而终止脚本 
        RAISERROR (N'无法导入作业“taskname”,因为已经有相同名称的多重服务器作业。', 16, 1) 
        GOTO QuitWithRollback  
      END 
      ELSE 
        -- 删除[本地]作业 
        EXECUTE msdb.dbo.sp_delete_job @job_name = N'taskname' 
        SELECT @JobID = NULL
      END BEGIN   — 添加作业
      EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , @job_name = N'taskname', @owner_login_name = N'CABO\cabo', @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'select * from a', @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'DDname', @enabled = 1, @freq_type = 8, @active_start_date = 20030113, @active_start_time = 0, @freq_interval = 1, @freq_subday_type = 1, @freq_subday_interval = 0, @freq_relative_interval = 0, @freq_recurrence_factor = 1, @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:-----------------------------------------------------------监控job
    SELECT 
    sjv.job_id, 
    name = convert(varchar(100),sjv.name), 
    sjv.enabled,
    last_run_info = 
    ( select top 1 convert(varchar,run_status)+'*'+convert(varchar,jh
    .run_Date)+'*'+convert(varchar,jh.run_time)
    from msdb.dbo.sysjobhistory jh where jh.job_id=sjv.job_id and jh.step_id=0 
    order by run_date desc, run_time desc )
    FROM msdb.dbo.sysjobs_view sjv