Sql If语句基于COUNT返回

时间:2013-06-03 18:14:26

标签: sql ssms

基本上,我希望修改我在数据库中的存储过程,该存储过程使用来自Web应用程序的数据更新表的记录(表x)。在更新表x之后,我想开发该存储过程以检查表x,以查看是否存在column_z为null的主键实例的记录。基本上,像

ALTER PROCEDURE [cred].[UpdateTablex]
(@field0 int,
@field1 int,
@field2 int,
@field3, int,
@field4 VARCHAR(100),
@field5 datetime,
@field6 datetime)
AS 
UPDATE tablex 
SET field4 = @field4,
field6 = @field6
WHERE field1 = @field1 AND
field2 = @field2 AND 
field3 = @field3 AND
field0 = @field0 AND  
field5 = @field5;

对于我的想法以及我认为可以开发的方式,其余的将是伪造的

IF  ((SELECT COUNT(field0) FROM tablex WHERE field6 is null AND field2 = @field2
AND field3 = @field3 AND field5 = @field5) equals 0)
exec cred.Demobilize(@field0, @field1);

或者简单地说,如果Select语句返回任何指示field6在任何地方为null的结果,那么我们什么都不做。显然那意味着如果Select语句什么都不返回,那么我想执行另一个存储过程。

这可能很简单,所以请原谅我,因为我对某些类型的SQL语法和用法都不熟悉,这就是其中之一。

另外,有人能指出我正确的方向,进一步教育自己这样的话题吗?

谢谢。

1 个答案:

答案 0 :(得分:5)

您可以在不使用变量的情况下执行if

IF  (0 = (SELECT COUNT(field0)
         FROM tablex
         WHERE field6 is null AND field2 = @field2 AND field3 = @field3 AND field5 = @field5
        )
    )
begin
    exec cred.Demobilize(@field0, @field1);
end;

在实践中,我认为这通常是使用not exists编写的:

IF  (not exists (SELECT 1
                 FROM tablex
                 WHERE field6 is null AND field2 = @field2 AND field3 = @field3 AND field5 = @field5
                )
    )
begin
    exec cred.Demobilize(@field0, @field1);
end;

not exists版本可以更快,因为遇到的第一行将满足条件子句。 count(*)版本必须找到所有匹配的行并计算它们。