`
foible
  • 浏览: 44715 次
  • 性别: 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 



 
分享到:
评论

相关推荐

    excel计算合并单元格所占行数

    ### Excel计算合并单元格所占行数 #### 知识点概述 在Excel中处理大量数据时,常常需要对合并单元格进行各种操作,比如计算它们所占据的行数。这种需求常见于需要统计每组数据的具体行数,或者是在进行数据分析时...

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

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

    基于excel的0.4级和0.6级弹簧管式精密压力表检定数据处理模型.pdf

    该模型分为三个部分:被检仪表和标准器信息录入模块、精密压力表检定记录表模块、精密表检定证书内页生成模块。 1. 被检仪表和标准器信息录入模块: 该模块录入被检仪表信息,包括使用单位、器号、测量范围、准确度...

    ASP 开发 应用 手册

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

    Excel多维引用示例的数据来源.rar

    在"21.1-11多维引用示例的数据来源.xls"中,"二维平面"工作表可能包含了一些示例数据,这些数据被组织成表格形式,每行代表一个特定的记录,每列代表一个属性。通过多维引用,我们可以根据需要从这些数据中提取特定...

    ASP常用数据库连接及操作的方法和技巧

    - `COUNT(*)` 或 `COUNT(字段名)` 对数据行数的统计或对某一栏有值的数据行数统计 - `MAX(字段名)` 取得一个表格栏最大的值 - `MIN(字段名)` 取得一个表格栏最小的值 - `SUM(字段名)` 把数据栏的值相加 引用...

    sql语句的多表连接查询[定义].pdf

    在学生和成绩的例子中,交叉连接会返回所有学生的每一条成绩记录,即使成绩表中没有对应的数据,结果集的大小将是两个表行数的乘积。 - `SELECT s.*, g.* FROM student s CROSS JOIN grade g;` 总结来说,SQL中的...

    OFFSET用得好,发量一点不见少

    OFFSET函数在Excel中是一个非常实用的工具,尤其在处理动态数据和创建动态图表时。...在实际工作中,熟练掌握OFFSET函数的运用可以大大提高数据处理的效率,同时也能让Excel工作表的动态性和智能性显著提升。

    解析SQL语句中Replace INTO与INSERT INTO的不同之处

    - 不允许在 `REPLACE INTO` 语句中引用当前行的值或在新行中使用计算的值,如 `SET col_name = col_name + 1` 会被视为 `SET col_name = DEFAULT(col_name) + 1`。 2. **权限与返回值**: - 使用 `REPLACE INTO` ...

    合并与拆分工作表的各种方法与模板汇总

    - **工作簿结构优化**:合理组织工作簿结构,比如设置主工作表汇总其他子工作表,便于管理和查看。 6. **宏的安全性与使用**: - **启用宏**:默认情况下,Excel可能禁用宏以保护系统安全。用户需要在信任中心...

    mysql的explain分析sql语句性能(慢查询和加没加索引)

    9. rows:根据表统计信息及索引选用情况,大致估算出找到所需要记录、读取的行数,该值越小越好。 10. Extra:额外的重要信息,常见且重要的有:using filesort(文件内排序,MySQL 无法用给定的索引进行排序,在...

    SQLServer数据库笔试题和答案.pdf

    3. 聚合函数含义:AVG求平均值,SUM求和,MAX求最大值,MIN求最小值,COUNT(*)返回所有行数,COUNT返回满足特定条件的记录数。 4. INNER JOIN:内连接,返回两个表中匹配的记录。基本语法是:SELECT...FROM 表1 ...

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

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

    SQL Server笔试题解答

    - **主键 (primary key)**:表中的一个或多个字段,其值唯一标识表中的每一条记录。 - **标识列 (identity)**:自增列,每次插入新记录时自动递增。 - **外键 (foreign key)**:用于建立表间关联的字段,引用另一...

    第04章销售管理数据库数据表的创建和管理.pptx

    在SQL Server 2005中,一个数据库可以包含大量表,每张表的列数有限,行数也有限制,但足以满足大多数实际需求。 接下来,我们深入学习数据类型,这是定义数据库中字段性质的关键。常见的数据类型包括: 1. 数字...

    数据库试题-含答案(5分每题,20题).pdf

    - **引用完整性**:通过外键约束确保表间引用的合法性。 - **自定义完整性**:根据业务需求设置的额外约束,确保数据的完整性和一致性。 13. **视图**:视图是从一个或多个表中选择数据的虚拟表,可以更新,但...

    Excel中R1C1样式引用详解.doc

    整列最大值可写为`=MAX($G:$G)`或`R1C7:R[行数]C7`。 学习和掌握R1C1样式引用不仅有助于深入理解Excel的内部工作原理,还可以提高编写复杂公式和VBA代码的效率,特别是在处理大量数据和自动化任务时。

    SQL语法大全

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

    SQL Server笔试题(Sql2000常见笔试题)

    - **Foreign Key**: 外键,用于建立两个表之间的关联,引用另一个表的主键。 - **Check**: 检查,用于定义列的约束条件,确保输入的数据符合特定规则。 - **Constraint**: 约束,用于限制表中数据的类型和范围,...

Global site tag (gtag.js) - Google Analytics