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 );
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 );
begin catch
--写这
end catch
--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
http://blogs.msdn.com/sqltips/archive/2005/06/07/426578.aspx
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 选项。这将确保一致的查询语义。请启用这些选项,然后重新发出查询。
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
@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