首先,您不能测试NULL的相等性。NULL表示未知值,因此您不知道它是否(或不)等于任何特定的值。请使用
@result IS NOT NULL
代替
@Result!=NULL
。
其次,如果可以尽量避免在SQL中使用这种顺序处理方式。SQL是用来处理集合而不是顺序处理事物的。您可以使用一个简单的SQL命令完成所有这些工作,而且运行速度可能会更快:
SELECT
MIN(hold) + 1
FROM
Numbers N1
WHERE
N1.name = 'Test' AND
NOT EXISTS
(
SELECT
*
FROM
Numbers N2
WHERE
N2.name = 'Test' AND
N2.hold = N1.hold + 1
)
上述查询基本上告诉SQL Server:“在名称为Test且行名为“Test”的保留值比当前所有行的最小保留值加1还要大的表Numbers中,给我最小的保留值加1(MIN(hold) + 1),并且这样的行不存在(整个“NOT EXISTS”部分)”。对于以下行:
Name Hold
-------- ----
Test 1
Test 2
NotTest 3
Test 20
SQL Server会找到所有名字为“Test”的行(1、2、20),然后找出哪些行没有一个名字为Test且hold = hold + 1的行。对于1,存在一个名为Test的行;对于2,也存在一个名为Test的行。对于Test,2,不存在Test,3,因此它仍然是潜在的结果。对于Test,20,不存在Test,21,所以我们得到:
Name Hold
-------- ----
Test 2
Test 20
现在SQL Server查找MIN(hold)并获得2,然后加1,因此您将得到3。
SQL Server可能不会完全按照我描述的操作执行。 SQL语句告诉SQL Server您要查找的内容,但不告诉它如何获取它。 SQL Server有自由使用任何它认为最有效的方法来获取答案。
关键是始终以集合的方式思考,以及这些集合是如何通过JOIN连接在一起,通过WHERE条件或在联接中的ON条件进行过滤,并在必要时进行分组和聚合(MIN,MAX,AVG等)。