时间:2016-02-24 19:34 来源: 我爱IT技术网 作者:佚名
欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【实现删除主表数据时, 判断与之关联的外键表是否有数据】,下面是详细的分享!
实现删除主表数据时, 判断与之关联的外键表是否有数据
-- SQL Server 2000 对错误处理不好控制, 一般还是建议做判断
-- 通过系统表查询系统表,可以获取某个表关联的所有外键表
-- 示例存储过程
CREATE PROC dbo.p_Delete
@tbname sysname, -- 基础数据表名
@PkFieldName sysname, -- 基础数据表关键字段名
@PkValue int -- 要删除的基础数据表关键字值
AS
SET NOCOUNT ON
DECLARE @bz bit, @s nvarchar(4000)
DECLARE tb CURSOR LOCAL
FOR
SELECT N'
SET @bz=CASE WHEN EXISTS(
SELECT * FROM ' + QUOTENAME(@tbname)
+ N' A, ' + QUOTENAME(OBJECT_NAME(B.fkeyid))
+ N' B
WHERE A.' + QUOTENAME((SELECT name FROM syscolumns WHERE colid=B.rkey AND id=B.rkeyid))
+ N'=B.' + QUOTENAME((SELECT name FROM syscolumns WHERE colid=B.fkey AND id=B.fkeyid))
+ N' AND A.' + QUOTENAME((SELECT name FROM syscolumns WHERE colid=B.rkey AND id=B.rkeyid))
+ N'=@id) THEN 1 ELSE 0 END'
FROM sysobjects A
JOIN sysforeignkeys B
ON A.id= B.constid
JOIN sysobjects C
ON A.parent_obj=C.id
WHERE A.xtype='f'
AND C.xtype='U'
AND OBJECT_NAME(B.rkeyid)=@tbname
OPEN tb
FETCH tb INTO @s
WHILE @@FETCH_STATUS=0
BEGIN
EXEC sp_executesql @s, N'@tbname sysname, @id int, @bz bit OUT', @tbname, @PkValue, @bz OUT
IF @bz=1
BEGIN
SET @s=N'UPDATE ' + QUOTENAME(@tbname)
+ N' SET bz=1 WHERE ' + QUOTENAME(@PkFieldName)
+ N'=@id'
EXEC sp_executesql @s, N'@id int', @PkValue
RETURN
END
FETCH tb INTO @s
END
CLOSE tb
DEALLOCATE tb
SET @s =N'DELETE FROM ' + QUOTENAME(@tbname)
+ N' WHERE ' + QUOTENAME(@PkFieldName)
+ N'=@id'
EXEC sp_executesql @s, N'@id int', @PkValue
GO
以上所分享的是关于实现删除主表数据时, 判断与之关联的外键表是否有数据,下面是编辑为你推荐的有价值的用户互动:
相关问题:sql 中两表有主外键关系,如何删除主表中数据,而...
答:如果只是为了保留子表中的具体数据,可以先把对应的记录插入到一个备份表中,再删除主表记录,此时原子表中对应记录也会被删除,但可以在备份表中查到。 如果是要把数据仍保存在子表中,就只能先撤消主外键关系再删除主表中记录了。当然,也可以... >>详细
相关问题:怎么删除有外键关联的数据表数据
答:传感器是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。 传感器的特点包括:微型化、数字化、智能化、多功能化、系统化... >>详细
相关问题:有两张表 A表和B表 B表中有外键 外键是A表中的主键...
答:常用办法1 delete from B where B.外键=x; delete from A where A.ID=x; 办法2(现在用的人少了): 建立触发器,再删除A中数据的同事删除B表中的满足条件的数据 办法3: 在为B表创建外键约束的时候指定练级删除,删除A表中的记录时,系统自动... >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
