22,302
社区成员




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