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,造成死循环。



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

相关文章推荐

sqlserver 中 @@rowcount的简单用法

返回受上一语句影响的行数。如果行数大于 20 亿,请使用 ROWCOUNT_BIG。    语法 @@ROWCOUNT        返回类型   int  注释...

SQL Server @@ROWCOUNT 、@@ERROR用法

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

SQLserver全局变量

  • 2013年04月16日 20:47
  • 15KB
  • 下载

SQLServer游标(Cursor)简介和使用说明 及全局变量说明和功能

游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许...
  • zzy7075
  • zzy7075
  • 2015年01月02日 10:59
  • 6290

SQLServer游标(Cursor)简介和使用说明 及全局变量说明和功能

游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许...

使用Application做全局变量

  • 2017年02月20日 09:57
  • 1.3MB
  • 下载

flask中jinja2使用全局变量

  • 2017年07月03日 18:06
  • 8KB
  • 下载

SQLServer中的全局变量

变量 Transact-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量。 局部变量 局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内...

全局变量宏的定义及使用

  • 2015年08月06日 10:33
  • 41KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SqlServer使用@@ROWCOUNT全局变量
举报原因:
原因补充:

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