基本上,我希望修改我在数据库中的存储过程,该存储过程使用来自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语法和用法都不熟悉,这就是其中之一。
另外,有人能指出我正确的方向,进一步教育自己这样的话题吗?
谢谢。
答案 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(*)
版本必须找到所有匹配的行并计算它们。