`
foible
  • 浏览: 44004 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

动态记录主表值被引用的行数

    博客分类:
  • SQL
阅读更多

db中存在主键人力human,由于日积月累的数据,再加上前期设置主外键的混乱,有许多的子表里的键都属于human表中humanID,loginID,humanMonitorID的外键,并且有些表根本没有建立外键但值却存放着外键值。

现在要彻底删除某些主表的值,但在删除前需要找到这些值在其它表引用的数据有多行,所以就有了下面的解决方法:

 

IF OBJECT_ID ('p_JCXX_HumanQueryHumanID') IS NOT NULL
	DROP PROCEDURE p_JCXX_HumanQueryHumanID
GO

-- 传入的主健ID,返回的是引用行数
CREATE PROCEDURE p_JCXX_HumanQueryHumanID @humanID nvarchar(128),
@totalCount INT OUTPUT
AS SET NOCOUNT OFF
DECLARE @num INT;
DECLARE @sql NVARCHAR(512);
DECLARE @ptab NVARCHAR(50);
DECLARE @pcol NVARCHAR(50);
DECLARE @ftab NVARCHAR(50);
DECLARE @fcol NVARCHAR(50);
DECLARE @hmid NVARCHAR(50);	-- 人力监控ID
DECLARE @lgid NVARCHAR(50);	-- 人力登陆ID
CREATE TABLE #T(
	ptab NVARCHAR(128),
	pcol NVARCHAR(128),
	ftab NVARCHAR(128),
	fcol NVARCHAR(128)
); 
SELECT @hmid=humanMonitorID, @lgid=loginID FROM Human WHERE humanID = @humanID;
INSERT INTO #T
SELECT rtable.name ptab, cn.name pcol, ftable.name ftab, fkcn.name fcol
FROM sysforeignkeys INNER
    JOIN sysobjects ftable ON sysforeignkeys.fkeyid = ftable.id INNER
    JOIN sysobjects rtable ON sysforeignkeys.rkeyid = rtable.id INNER
    JOIN syscolumns fkcn ON sysforeignkeys.fkeyid = fkcn.id AND sysforeignkeys.fkey = fkcn.colid INNER
    JOIN syscolumns cn ON sysforeignkeys.rkeyid = cn.id AND sysforeignkeys.rkey = cn.colid
WHERE rtable.name IN ('Human')

-- 主表名,主列名,外表名,外列名(数据库未建立外键,但数值是属于外健,手动指定)
INSERT INTO #T (ptab,pcol,ftab,fcol)
	SELECT 'Human','humanID','MonitorModifyHistory','humanID' UNION
	SELECT 'Human','humanID','TypicalPart','designer';
BEGIN
	DECLARE datas CURSOR FOR SELECT * FROM #T 
	OPEN datas;
	FETCH next FROM datas INTO @ptab,@pcol,@ftab,@fcol
	WHILE @@FETCH_STATUS=0
	BEGIN
		IF @pcol ='humanID'
    		SET @sql = 'select @i=count(' + @fcol + ') from [' + @ftab + '] WHERE ' + @fcol + ' = '''+ @humanID + '''';
		IF @pcol ='loginID'
    		SET @sql = 'select @i=count(' + @fcol + ') from [' + @ftab + '] WHERE ' + @fcol + ' = '''+ @lgid + '''';
		IF @pcol ='humanMonitorID'
    		SET @sql = 'select @i=count(' + @fcol + ') from [' + @ftab + '] WHERE ' + @fcol + ' = '''+ @hmid + '''';
		IF @sql IS NOT NULL 
		BEGIN
    		EXEC sp_executesql @sql, N'@i int output',@num OUTPUT
    		IF @num >0
    			SET @totalCount = @totalCount + @num;
		END;
		FETCH next FROM datas INTO @ptab,@pcol,@ftab,@fcol
	END;
	CLOSE datas;
	DEALLOCATE datas;;
END 



 
分享到:
评论

相关推荐

    多页报表限定行数并补空行

    报表名)引用),必须<BR>txtCurrentPage 报表主体节上的[txtCurrentPage]文本框控件 ,必须<BR>txtRecordNum 报表定义的私人变量 数据类型:Integer 用于记录数的递增,必须(注:在报表模块顶部声明 : Private ...

    ASP 开发 应用 手册

    COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 MAX(字段名) 取得一个表格栏最大的值 MIN(字段名) 取得一个表格栏最小的值 SUM(字段名) 把数据栏的值相加 引用以上函数的方法: sql="select ...

    Excel VBA实用技巧大全 附书源码

    03032设定工作表被保护时是否启用数据透视表控件和操作 03033设定工作表被保护时是否可以选定单元格 03034新建工作表并重命名 03035复制工作表 03036移动工作表 03037删除工作表 03038保护工作表 03039撤销保护工作...

    SQL语法大全

    COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 MAX(字段名) 取得一个表格栏最大的值 MIN(字段名) 取得一个表格栏最小的值 SUM(字段名) 把数据栏的值相加 引用以上函数的方法: sql="select sum...

    Excel VBA与数据库整合应用范例精讲

    实例3-40 从两个数据表中查询出只存在于某个数据表的记录 实例3-41 将查询结果生成一个数据表 实例3-42 将查询结果保存为一个XML文件 实例3-43 利用工作表实现记录的分页显示 实例3-44 利用窗体实现记录的分页...

    VBA与数据库

    1-15 利用已有的数据表创建新数据表(Access)(前绑定方法引用Access对象库) 28 2-1 检查数据表是否存在(ADO) 28 •实例2-2 检查数据表是否存在(ADOX) 32 •实例2-3 检查数据表是否存在(DAO) 33 •实例2-4 ...

    SQL COOKBOOK(压缩1/2)

    4.17删除从其他表引用的记录 第5章 元数据查询 第6章 使用字符串 第7章 使用数字 第8章 日期运算 第9章 日期操作 第10章 范围处理 第11章 高级查找 第12章 报表和数据仓库运算 第13章 分层查询 第...

    SQL COOKBOOK(压缩2/2)

    4.17删除从其他表引用的记录 第5章 元数据查询 第6章 使用字符串 第7章 使用数字 第8章 日期运算 第9章 日期操作 第10章 范围处理 第11章 高级查找 第12章 报表和数据仓库运算 第13章 分层查询 第...

    Excel VBA与数据库整合应用范例精讲书及源代码

    实例3-40 从两个数据表中查询出只存在于某个数据表的记录 实例3-41 将查询结果生成一个数据表 实例3-42 将查询结果保存为一个XML文件 实例3-43 利用工作表实现记录的分页显示 实例3-44 利用窗体实现记录的分页...

    Exce百宝箱——2012版本.rar

    【将公式转换成值】:将指定工作表中指定区域的公式转换成值,可以自由选择工作表和单元格范围。 【根据工资计算钞票】:根据员工的工资计算需要多少张100元、50元......1元的钞票,可以批量计算。发现金工资的财务...

    Excel百宝箱9.0无限制破解版.rar

    【将公式转换成值】:将指定工作表中指定区域的公式转换成值,可以自由选择工作表和单元格范围。 【根据工资计算钞票】:根据员工的工资计算需要多少张100元、50元......1元的钞票,可以批量计算。发现金工资的...

    EXCEL集成工具箱V6.0

    【插入行数】 对工作表隔行插入行并可以复制标题行,其中对相隔行数、插入行数等可以自定义。 【注解样式】 可以插入多达50种样式的注解,支持随时切换当前注解样式为指定的样式。 【工作表拆分】 将当前工作表的...

    EXCEL集成工具箱V8.0完整增强版(精简)

    【插入行数】 对工作表隔行插入行并可以复制标题行,其中对相隔行数、插入行数等可以自定义。 【注解样式】 可以插入多达50种样式的注解,支持随时切换当前注解样式为指定的样式。 【工作表拆分】 将当前工作表的...

    vb学生成绩管理系统

    '首先查询表中是否存在关键字相同的记录 strSQL = "select * from 课程情况表" strSQL = strSQL & " Where 课程号='" + Text1.Text + " '" strSQL = strSQL & " and 课程名='" + Text2.Text + "'" ADOrs.Open ...

    2009达内SQL学习笔记

    在处理SQL语句时,其中所有的空格都被忽略(空格只用来分开单词,连续多个空格当一个用)。 SQL语句可以在一行上写出,建议多行写出,便于阅读和调试。 多条SQL语句必须以分号分隔。多数DBMS不需要在单条SQL语句后...

    动态规划 ppt演示

    动态规划法的关键就在于,对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。 动态规划的逆向思维法是指从问题目标状态出发倒退回初始状态或边界状态的...

    我整理的VBA 自定义函数大全 共138页

    50.对多个用同一分隔符分隔的待查找元素,逐一在表区域首列内搜索,将返回选定单元格的值相加,相当于多个vlookup函数相加,对于查找不到的元素在批注中添加,以提醒用户。 51.根据个人所得税(工资)反算工资数 52....

    精通SQL 结构化查询语言详解

    17.3.2 @@CURSOR_ROWS全局变量确定游标的行数  17.3.3 @@FETCH_STATUS全局变量检测FETCH操作的状态 17.3.4 游标的关闭与释放 17.3.5 游标变量  17.3.6 使用系统过程管理游标  17.4 Oracle中游标的使用  ...

    存储过程的安全及性能优化

    当DML先于DDL执行的时候,SQL Server会重新编译存储过程,因为DML引用了DDL中的一些内容,也就是所谓的一些表。这个时候SqlServer需要统计由DDL定义的一些对象的变化。以此来创建DML的执行计划,如果将DDL放在前面...

    软件资料文档标准规格

     逐个阐明其它可供选择的方案,并重点说明未被推荐的理由。 8 结论意见  ● 可着手组织开发  ● 需等待若干条件具备后才能开发  ● 需对开发目标进行某些修改  ● 不能进行或不必进行  ● 其它 项目...

Global site tag (gtag.js) - Google Analytics