SQL检查其它表是否已经包含当前业务表的数据引用

该文章介绍了一个SQL SERVER的存储过程,用于检查指定表是否在其他业务表中被引用,以防止误删除导致的数据依赖问题。该过程接收表名和关键字作为参数,返回被引用的次数。

在开发应用的过程中,经常会防止用户的误删除,会检查是否已经存在其它业务的引用。

以下是在SQL SERVER编写的存储过程,参数为表名,以及关键字。自动会检查此表是否已经被其它业务表引用,并返回被引用的次数。

-- =============================================
-- Author:		EVAN
-- Create date: 2019/3/6 21:15
-- Description:	判断表的数据是否有引用
-- =============================================
CREATE PROCEDURE [dbo].[sp_CheckDataIsRefer]
	-- Add the parameters for the stored procedure here
	@TableName nvarchar(100), 
	@Oid nvarchar(100)
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    --获取表的外键关系
	select object_name(a.parent_object_id) 'tablename',
	filedname 'fieldname' 
	into #temprefer
	 from (	 select t1.*,t3.name filedname from sys.foreign_keys t1
	 inner join 
	 sys.foreign_key_columns t2 
	 on t1.object_id = t2.constraint_object_id
	 inner join sys.all_columns t3 
	 on t2.parent_object_id = t3.object_id 
	 and t2.parent_column_id = t3.column_id
	 ) 
	 a
	 where a.referenced_object_id=object_id(@TableName);

	 declare @tname nvarchar(100), @fname nvarchar(100);
	 declare @sql nvarchar(1000);
	 declare @ret int;
	 declare @retvalue int;
	 set @ret =0;
	 set @retvalue =0 ;

	

	DECLARE mycur CURSOR FOR (SELECT tablename,fieldname FROM #temprefer);
	open mycur;
	fetch next from mycur into @tname,@fname;
	WHILE @@FETCH_STATUS = 0
    BEGIN

		set @sql = 'select @ret= count(1) from '+ @tname +' where ' + @fname +'=''' + @Oid+''' and GcRECORD is null';
		exec sp_executesql  @sql ,N'@ret int out',@ret out;
		
		set @retvalue = @retvalue + @ret;

		fetch next from mycur into @tname,@fname;
	END
	CLOSE mycur; --关闭游标
	DEALLOCATE mycur; --释放游标
	select @retvalue;
END

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值