当前位置: 代码迷 >> Sql Server >> 存储过程中有链接服务器解决思路
  详细解决方案

存储过程中有链接服务器解决思路

热度:103   发布时间:2016-04-24 08:48:59.0
存储过程中有链接服务器
create proc sw_sw
as

insert  into  table1
select * from [10.0.0.1].aaa.dbo.table1

insert  into  table1
select * from [10.0.0.2].aaa.dbo.table1

insert  into  table1
select * from [10.0.0.3].aaa.dbo.table1

insert  into  table1
select * from [10.0.0.4].aaa.dbo.table1

go

请教大家,上面这个存储过程该怎么写,如果IP 1 不在线,后面的都不会执行。
如果1,2,3,4其中任何一个不在线,这个存储过程都创建不了

有没有什么办法,先判断一个IP是不是在线,如果不在线,跳转到下一个IP运行。
------解决思路----------------------
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].Proc_sw_sw') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].Proc_sw_sw
GO
-- =============================================
-- Author: yng
-- Create date: 2015-10-07
-- Description: 请教大家,上面这个存储过程该怎么写,如果IP 1 不在线,后面的都不会执行。
--              如果1,2,3,4其中任何一个不在线,这个存储过程都创建不了
-- 有没有什么办法,先判断一个IP是不是在线,如果不在线,跳转到下一个IP运行。
-- =============================================
CREATE PROCEDURE dbo.Proc_sw_sw 
AS
BEGIN
SET NOCOUNT ON;
DECLARE @t TABLE ( 
rowNum INT IDENTITY(1,1) --行号, 用来循环
, linkServer VARCHAR(50) --链接服务器名称
, sqlString NVARCHAR(MAX) --链接服务器对应要执行的SQL语句
, isMain BIT --是否为主要的IP, 即本ip执行不了, 其它的不应该再继续执行
)
INSERT INTO @t(linkServer, sqlString, isMain) VALUES('10.0.0.1', N'insert  into  table1 select * from [10.0.0.1].aaa.dbo.table1', 1)
INSERT INTO @t(linkServer, sqlString, isMain) VALUES('10.0.0.2', N'insert  into  table1 select * from [10.0.0.2].aaa.dbo.table1', 0)
INSERT INTO @t(linkServer, sqlString, isMain) VALUES('10.0.0.3', N'insert  into  table1 select * from [10.0.0.3].aaa.dbo.table1', 0)
INSERT INTO @t(linkServer, sqlString, isMain) VALUES('10.0.0.4', N'insert  into  table1 select * from [10.0.0.4].aaa.dbo.table1', 0)

DECLARE @linkServer VARCHAR(50), @sqlString NVARCHAR(MAX), @isMain BIT, @sqlTest NVARCHAR(MAX)
DECLARE @i INT,@iMax INT
SELECT @i=1,@iMax=ISNULL(MAX(rowNum),0) FROM @t

WHILE @i<=@iMax
BEGIN
SELECT @linkServer=linkServer, @sqlString=sqlString, @isMain=isMain  FROM @t WHERE rowNum=@i
SET @sqlTest = 'select top 1 * from ['+@linkServer+'].aaa.sys.objects'
BEGIN TRY
--测试链接服务器是否正常
EXEC (@sqlTest)
--如果无异常,执行相关语句
EXEC (@sqlString)
END TRY
BEGIN CATCH
IF(@isMain=1)
BEGIN
BREAK;
END
END CATCH
END
END
GO
  相关解决方案