【SQL】找出行数与自增标识值不相等的表(即有缺行)

原文:【SQL】找出行数与自增标识值不相等的表(即有缺行)

环境:mssql ent 2k8 r2

原理:遍历所有含自增列的用户表,用sp_spaceused过程分别获取每张表的行数并写入临时表,然后使用IDENT_CURRENT函数获取表的最大标识值,比较二者并返回结果

IF OBJECT_ID('tempdb..#TableRowCount','U') IS NOT NULL DROP TABLE #TableRowCount
GO
CREATE TABLE #TableRowCount (Name sysname PRIMARY KEY, RowCnt DECIMAL(11,0), Reserved VARCHAR(18), Data VARCHAR(18), Index_Size VARCHAR(18), Unused VARCHAR(18))
GO
DECLARE curCntAllTableRows CURSOR LOCAL FAST_FORWARD FOR
        SELECT name FROM sys.tables WHERE OBJECTPROPERTY(object_id,'TableHasIdentity')=1
OPEN curCntAllTableRows
DECLARE @TableName sysname
FETCH NEXT FROM curCntAllTableRows INTO @TableName
WHILE @@FETCH_STATUS=0
BEGIN
 INSERT INTO #TableRowCount EXEC sys.sp_spaceused @TableName
 FETCH NEXT FROM curCntAllTableRows INTO @TableName
END
CLOSE curCntAllTableRows
DEALLOCATE curCntAllTableRows

/*由于IDENT_CURRENT对于空表也会返回1,所以做特别处理*/
WITH cteA AS (
SELECT Name,RowCnt,CASE IDENT_CURRENT(Name) WHEN 1 THEN RowCnt ELSE IDENT_CURRENT(Name) END AS 'CurrID'
FROM #TableRowCount
)
SELECT Name,RowCnt,CurrID
FROM cteA
WHERE RowCnt<>CurrID

文毕。

 

时间: 2024-10-26 17:03:29

【SQL】找出行数与自增标识值不相等的表(即有缺行)的相关文章

SQL SERVER 2000 中的标识值获取函数

server|函数 IDENTITY(标识)列,也有很多人称之为自增列,在SQL Server 2000中,标识列通过IDENTITY来定义,下面是与获取最后插入记录的标识值有关的函数的一个示例说明     SQL Server 中,可以使用 SCOPE_IDENTITY(). @@IDENTITY . IDENT_CURRENT() 来取得最后插入记录的值值,它们的区别在于:SCOPE_IDENTITY() 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值.一个

sql server数据库主键自增一次增长了1000多

问题描述 用.net做的一个信息管理系统,用的sqlserver数据库,把主键设置了自增,增量为1,如果是今天向表中添加信息,会按照逐条加1增长,但是明天如果再添加的话,主键的值就会比上一条数据多出1000多,搞不懂这是为什么,求大神帮忙!!附图: 解决方案 解决方案二:看看你表设计另外事务中添加的时候,就算回滚了,自增还是会体现到数据库的解决方案三:确定增量为1,应该有频繁的插入删除操作.解决方案四:设计就是按正常设计的,在添加信息的时候也没有用到事务操作解决方案五:插入失败,回滚时,等下次插

SQL 2005使用OUTPUT子句捕获数据插入时的标识值

在insert语句或者delete语句执行后,SQL Server只返回受影响的记录行的总数,如果我们想知道到底所插入/所删除的记录的具体信息的话,这就有点复杂了.在SQL Server 2005之前的版本中,如果希望从已插入和已删除的虚拟表中捕获数据,我们只能通过触发器来实现.在SQL Server 2005中,我们可以利用OUTPUT子句来实现这个功能.我们可以在insert ... SELECT语句使用OUTPUT子句,捕获所有插入的标识值.以前这需要某种类型的循环或暂时改变目标表才能实现

sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别

原文:sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别 IDENT_CURRENT 返回为任何会话和任何作用域中的指定表最后生成的标识值. 语法 IDENT_CURRENT('table_name') 参数 table_name 是将要返回其标识值的表的名称.table_name 的数据类型为 varchar,没有默认值. 返回类型 sql_variant 注释 IDENT_CURRENT 类似于 Microsoft

线程-sql 找错,一个很奇怪的错误

问题描述 sql 找错,一个很奇怪的错误 sql = "UPDATE bs2_dl_road_min SET count=count+{0} WHERE time='{1}' " "AND host_ip='{2}' AND module='{3}' AND method='{4}' AND status='{5}' " "AND size_level='{6}' AND level='{7}' AND submodule_road='{8}'"

oracle sql实现某数与表的一列数据进行比较相减后给下一行

问题描述 oracle sql实现某数与表的一列数据进行比较相减后给下一行 例如表格数据: ZD 1 2 3 4 实现:给任意一个数字(数字不大于表ZD列之和),当前以8说明 效果: ZD ZD1 1 1 2 2 3 3 4 2 ---规则: 第一行 8>1 所以ZD1为1,剩余7 第二行 7>2 所以ZD1为2,剩余5 第三行 5>3 所以ZD1为3,剩余2 第四行 2<4 所以ZD1为2,剩余0 解决方案 CREATE TABLE TEST_WF( ZD INT ); INSE

从去哪儿数据看APEC:北京出行人次周环比增两倍

11月初,APCE峰会在京召开.随着企事业单位纷纷迎来"http://www.aliyun.com/zixun/aggregation/39432.html">APEC黄金周",北京的区域旅游引擎正式启动,从日前在线旅游平台去哪儿网发布的数据来看,不少北京人已经"动起来"了. 出行人次环比增两倍 小长假促行效应明显 去哪儿网数据显示:3721.html">2014年APEC期间,从北京出发的机票搜索预订高峰由10月20日开始持续到10

如何通过SQL找出2个表里值不同的列的方法_Mysql

以下有两个表,他们的结构完全相同,请通过SQL找出值不同的列. Student_1 NAME AGE SCORE peter 26 100 jack 25 96 daniel 26 48 bark 21 69     Student_2 NAME AGE SCORE peter 26 89 jack 25 96 daniel 26 48 bark 21 69   方法一 -- NOT EXISTS: 复制代码 代码如下: SELECT *FROM Student_1 S1WHERE NOT EX

SQL Server 2005------函数

原文:SQL Server 2005------函数 SQL Server 2005支持用户自定义函数和内置系统函数,根据返回值类型又分为标量函数和表值函数. 1.标量函数标量函数:返回单个数据值,返回类型可以是除 text.ntext.image.cursor 和 timestamp 外的任何数据类型.标量函数:分为内联标量函数和多语句标量函数.内联标量函数:没有函数体,标量值是单个语句的结果.多语句标量函数:定义在 BEGIN...END 块中的函数体包含一系列返回单个值的 Transact