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



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

相关文章推荐

SQL 中OPENQUERY的使用

OpenQuery 是SQL Server用来与其他Server交互的一种技术,通过OpenQuery,SQL Server 可以直接访问其他数据库资源。 而其他数据库在OpenQuery 表达式中是...

在SQL Server中使用OpenQuery访问其他数据库

OpenQuery 是SQL Server用来与其他Server交互的一种技术, 通过OpenQuery,SQL Server 可以直接访问其他数据库资源。 而其他数据库在OpenQuery 表达...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

SqlServer调用OPENQUERY函数远程执行增删改查

由于业务需求,我的SqlServer数据库通过MySQL的ODBC驱动连接了一个远程MySQL数据库,在SqlServer上要怎么远程执行MySQL命令呢,经过一番百度,将练习内容整理如下。 /* ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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