SqlServer使用@@ROWCOUNT全局变量

原创 2015年11月19日 10:58:57

我在一段while循环语句中设定了循环结束条件,执行语句时出现数据溢出错误,因此判断为循环结束条件失效,导致死循环至数据溢出,可是找了好久都没发现问题所在。

SQL表  [Structs]包含三个字段[ItemID]、[ParentID]、[LevelNum],表示层次ID、父层次ID、层次级数。

CREATE TABLE [dbo].[Structs](
	[ItemID] [VARCHAR](50) NULL,
	[ParentID] [VARCHAR](50) NULL,
	[LevelNum] [INT] NULL
)


表数据如下



表值函数GetChildren获取某个层次自身及的所有子层次信息。

ALTER FUNCTION [dbo].[GetChildren](@ID VARCHAR(50))
RETURNS @Children TABLE(ItemID VARCHAR(50),ParentID VARCHAR(50), LevelNum INT)
AS
BEGIN
	--根据ID获取项目当前等级
	DECLARE @LevelNum INT
	SELECT @LevelNum = LevelNum FROM Structs WHERE ItemID = @ID
	--将对应ID的记录插入新表
	INSERT INTO @Children SELECT * FROM Structs WHERE ItemID = @ID
	--连接原表,查询对应ID的所有子集
	WHILE @@ROWCOUNT <> 0
	BEGIN
		INSERT INTO @Children
		SELECT a.ItemID, a.ParentID, a.LevelNum
		FROM Structs a,@Children b
		WHERE a.ParentID = b.ItemID AND b.LevelNum = @LevelNum
		SET @LevelNum = @LevelNum + 1
	END
	RETURN 
END


经过仔细的思考,既然死循环了,就表示循环条件失效,即 @@ROWCOUNT <> 0恒为真了,@@ROWCOUNT 表示受影响的行数,一般用作判断DML语句即增删改操作是否成功,我令LevelNum每次循环+1,数据表中LevelNum最大只到4,按理说到加到5的时候INSERT INTO语句的WHERE条件就不成立,此时@@ROWCOUNT=0,循环就该结束了,然而最终@@ROWCOUNT<>0,为什么呢?于是我继续往下看,终于发现,我在循环结束之前添加结束条件,SET @LevelNum = @LevelNum + 1,难道这个SET语句
会导致@@ROWCOUNT <> 0 吗,为了验证这个猜测,我将语句做了修改,把循环结束条件放到了INSERT INTO语句之前。

WHILE @@ROWCOUNT <> 0
	BEGIN
		SET @LevelNum = @LevelNum + 1
		INSERT INTO @Children
		SELECT a.ItemID, a.ParentID, a.LevelNum
		FROM Structs a,@Children b
		WHERE a.ParentID = b.ItemID AND b.LevelNum = @LevelNum - 1
	END

接下来新建查询调用表值函数GetChildren

SELECT * FROM  dbo.GetChildren('5')

执行成功,没有发生溢出错误,确定是SET语句导致@@ROWCOUNT恒不为0,造成死循环。



版权声明:本文为博主原创文章,未经博主允许不得转载。

@@ERROR @@ROWCOUNT 返回的都是上一条SQL 语句后的执行信息。

比如下面的SQL 语句:select EmployeeID from employees  -- 这条SQL 语句返回9条记录print(@@error)print(@@ROWCOUNT)返回的结果是...
  • zhanglei5415
  • zhanglei5415
  • 2008年02月15日 17:05
  • 2070

sqlserver 中 @@rowcount的简单用法

返回受上一语句影响的行数。如果行数大于 20 亿,请使用 ROWCOUNT_BIG。    语法 @@ROWCOUNT        返回类型   int  注释...
  • ht_gaogao
  • ht_gaogao
  • 2014年01月27日 10:57
  • 2018

SQL Server @@ROWCOUNT 、@@ERROR用法

@@rowcount设置为受影响或被读取的行的数目。 @@error是系统函数,当没有发生错误时返回0,如果发生错误时@@error @@error只记录当前错误,如果存储过程执行多个操作...
  • qq_34496400
  • qq_34496400
  • 2016年04月06日 09:43
  • 1064

SQL备忘-基本控制语句复习及@@ROWCOUNT陷阱纪实

作者fbysssmsn:jameslastchina@hotmail.com  blog:blog.csdn.net/fbysss声明:本文由fbysss原创,转载请注明出处关键字:SQL语句    ...
  • fbysss
  • fbysss
  • 2006年07月08日 10:19
  • 2856

SQL Server中查看所有表RowCount最高效的SQL

-- Shows all user tables and row counts for the current database -- Remove OBJECTPROPERTY functi...
  • sxycgxj
  • sxycgxj
  • 2011年05月26日 13:36
  • 867

sql count执行速度测试

最近做项目开发的时候要对数据库里面的数据数量进行统计使用,数据库的大概有2000w多的数据。数据库是mysql5.6 用的是远程连接测试 ELECT COUNT(*) 执行语句: select co...
  • hxmandzzx
  • hxmandzzx
  • 2016年06月07日 18:40
  • 643

postgresql 类似 oracle sql%rowcount 用法 的全局变量

http://wiki.openbravo.com/wiki/ERP/2.50/Developers_Guide/Concepts/DB/PL-SQL_code_rules_to_write_Orac...
  • wangdeng1314
  • wangdeng1314
  • 2011年12月12日 19:48
  • 2821

SQL Server中@@ROWCOUNT的用法

转自:http://www.studyofnet.com/news/146.html 本文导读:@@ROWCOUNT返回上一语句受影响的行数!和@ERROR一样的特性,在每一条语句执行后都将...
  • suyu_yuan
  • suyu_yuan
  • 2016年10月18日 16:04
  • 562

SQL中@@ROWCOUNT函数

返回受上一语句影响的行数。如果行数大于 20 亿,请使用 ROWCOUNT_BIG。    语法 @@ROWCOUNT        返回类型    int  ...
  • CsethCRM
  • CsethCRM
  • 2013年07月05日 10:33
  • 682

oracle中的sql%rowcount

sql%rowcount用于记录修改的条数,就如你在sqlplus下执行delete from之后提示已删除xx行一样, 这个参数必须要在一个修改语句和commit之间放置,否则你就得不到正确的修改行...
  • cuiyan1982
  • cuiyan1982
  • 2015年05月26日 14:35
  • 243
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SqlServer使用@@ROWCOUNT全局变量
举报原因:
原因补充:

(最多只允许输入30个字)