在开发应用的过程中,经常会防止用户的误删除,会检查是否已经存在其它业务的引用。
以下是在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
该文章介绍了一个SQL SERVER的存储过程,用于检查指定表是否在其他业务表中被引用,以防止误删除导致的数据依赖问题。该过程接收表名和关键字作为参数,返回被引用的次数。
3283

被折叠的 条评论
为什么被折叠?



