存储过程中有链接服务器

liiu83724 2015-10-03 09:30:20
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运行。
...全文
171 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2015-10-07
  • 打赏
  • 举报
回复
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
天行驭龙 2015-10-07
  • 打赏
  • 举报
回复
可以以,SQL是数据库开发语言,一定可以实现你的设想
tcmakebest 2015-10-06
  • 打赏
  • 举报
回复
写 四个存储过程吧, 在代码中循环, 再 try catch ,仍然感觉这种设计太奇葩了
liiu83724 2015-10-05
  • 打赏
  • 举报
回复
求顶,请高手指点一二

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧