我们在 SQL Server 2005 中有一个循环,它在一个表上循环获取每个项目的父项,直到它到达树的顶部:
DECLARE @T Table
(
ItemID INT NOT NULL PRIMARY KEY,
AncestorID INT NULL
)
其中有这样的数据:
ItemID | AncestorID
1 2
2 3
3 4
4 NULL
我们有一个循环基本上可以做到这一点:
DECLARE @AncestorID INT
SELECT @AncestorID = 1
WHILE (@AncestorID IS NOT NULL)
BEGIN
--Do some work
SELECT @AncestorID = T.AncestorID
FROM @T t
WHERE T.ItemID = @AncestorID
print @AncestorID
END
(是的,我知道 SQL 是基于设置的,这是逐行处理的,“做一些工作”需要逐行完成是有原因的)。
这一直很好,直到今天我们最终陷入无限循环。原来原因是一些错误的数据:
ItemID | AncestorID
1 2
2 3
4 NULL
ItemID
3被删除。循环现在永远不会结束,因为AncestorID
is never NULL
- 它保持在 3。
如果查询返回 0 行,是否有重写 select 语句以使@AncestorID
null SELECT
,或者我需要有一个单独的SELECT
语句来计算记录和一些IF ELSE
类型逻辑?