declare @srvr nvarchar(128), @retval int;
set @srvr = 'my_linked_srvr';
begin try
    exec @retval = sys.sp_testlinkedserver @srvr;
end try
begin catch
    set @retval = sign(@@error);
end catch;
if @retval <> 0
  raiserror('Unable to connect to server. This operation will be tried later!', 16, 2 );

解决方案 »

  1.   

    begin   tryend   try
    begin catch
    --写这
    end catch
      

  2.   


    --2000
    select * from openquery(some_servr, 'select 1') 
    if @@error <> 0 
    begin 
    print 'Error' 
    end 
    go 
    exec('select * from openquery(some_servr, ''select 1'')') 
    if @@error <> 0 
    begin 
    print 'Error' 
    end 
      

  3.   

    ref:Test linked server connection settings
    http://blogs.msdn.com/sqltips/archive/2005/06/07/426578.aspx
      

  4.   

    好像还不行,比如
    exec('select * from openquery(LK, ''select 1'')') 
    if @@error <> 0 
    begin 
    print 'Error' 
    end 
    else
    print 'OK'LK是一个我随便配置的链接服务器,实际上肯定连不上,我希望出现的结果是“Error”,但在查询分析器中执行的结果是:
    服务器: 消息 17,级别 16,状态 1,行 1
    SQL Server 不存在或拒绝访问。
    如果放在存储过程中执行,则会出现:服务器: 消息 7405,级别 16,状态 1,行 1
    异类查询要求为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项。这将确保一致的查询语义。请启用这些选项,然后重新发出查询。
      

  5.   

    这种错误是无法在SQLSERVER里通过代码来捕获的
      

  6.   

    实验这个函数CREATE FUNCTION trylnk(@server nvarchar(128)) 
    RETURNS int AS  
    BEGIN /*
    Determines if a specified remote SQL server can be connected to   
        1  =  Running
       -1  =  Down*/
       DECLARE @up int   DECLARE @islinked  char(1)
       DECLARE @timeout   int 
       DECLARE @hr int
       DECLARE @sql int
       DECLARE @cnt int ; SET @cnt = 0
       DECLARE @server_resolved sysname
       DECLARE @status int ; SET @status = 0
       
      set  @islinked = 'N'
      set @timeout = 10   IF @islinked='Y'
       BEGIN
       
          SELECT @cnt=COUNT(*)
          FROM master.dbo.sysservers
          WHERE srvname=@server
          AND isremote=1
       
          IF @cnt<>1
          BEGIN
             RETURN(1)
          END
       
          SELECT @server_resolved = datasource
          FROM master..sysservers
          WHERE srvname=@server
          AND isremote=1
       
       END
       ELSE
       
          SELECT @server_resolved = @server
          
       EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @sql OUTPUT
       IF @hr<>0 EXEC sp_OAGetErrorInfo @sql
       
       EXEC @hr = sp_OASetProperty @sql ,'LoginSecure','True'
       EXEC @hr = sp_OASetProperty @sql ,'LoginTimeout',10
       EXEC @hr = sp_OAMethod @sql,'Connect',null,@server_resolved
       IF @hr<>0 EXEC sp_OAGetErrorInfo @sql
       
       EXEC @hr = sp_OAGetProperty @sql ,'Status',@status OUTPUT
       EXEC @hr = sp_OAMethod @sql,'DisConnect',null
       EXEC @hr=sp_OADestroy @sql
       
       SELECT @up = CASE WHEN @status = 1
                         THEN 1 ELSE -1 ENDRETURN @upEND
      

  7.   

    create function fgetsstatus(
     @servername varchar(50)     --服务器名
     ,@userid varchar(50)='sa'    --用户名,如果为nt验证方式,则为空
     ,@password varchar(50)=''    --密码) returns varchar(20)
    as
    begin
     declare @re varchar(20),@ire int      --返回状态
     declare @srvid int          --定义服务器、数据库集id
     declare @err int,@src varchar(255), @desc varchar(255) --错误处理变量--创建sqldmo对象
     exec @err=sp_oacreate 'sqldmo.sqlserver',@srvid output
     if @err<>0 goto lberr--连接服务器
     if isnull(@userid,'')='' --如果是 Nt验证方式
     begin
      exec @err=sp_oasetproperty @srvid,'loginsecure',1
      if @err<>0 goto lberr  exec @err=sp_oamethod @srvid,'connect',null,@servername
     end
     else
      exec @err=sp_oamethod @srvid,'connect',null,@servername,@userid,@password if @err<>0 goto lberr--获取服务器状态
     exec @err=sp_oagetproperty @srvid,'Status',@ire output
     if @err<>0 goto lberr
     
     set @re=case @ire when 0 then '未知'
       when 1 then '运行...'
       when 2 then '暂停'
       when 3 then '停止...'
       when 4 then '正在启动...'
       when 5 then '正在启动停止...'
       when 6 then '连接...'
       when 7 then '正在暂停...' end
     return(@re)
    lberr:
     exec sp_oageterrorinfo NULL, @src out, @desc out 
     declare @errb varbinary(4)
     set @errb=cast(@err as varbinary(4))
     exec master..xp_varbintohexstr @errb,@re out
     set @re='错误号: '+@re
       +char(13)+'错误源: '+@src
       +char(13)+'错误描述: '+@desc
     return(@re)
    end
    go