如何在SQL Server中检查select查询结果是否为NULL

3

在SQL Server中,我该如何验证查询是否返回了NULL,并根据此运行代码块。例如,在查询1中,我想检查如果count(*)不为null,然后检查它是否大于0。我应该在这里使用if exists吗?

if select count(*) from tbl1 not is NULL then 
   if select count(*) from tbl1 where count(*)>0 then
      raiserror()
   end if 
end if 

在Oracle中,可以使用IF INSERTING THENIF updating THENif deleting then根据列运行某个代码块。那么在SQL Server中该如何实现呢?请参考以下Oracle代码。

CREATE OR REPLACE TRIGGER tr_name
    BEFORE DELETE OR INSERT OR UPDATE OF column1 ON tbl1
    FOR EACH ROW
    WHEN (NEW.column1 IS NOT NULL)
begin
IF INSERTING THEN
    run some code like check if there are more than row in a table and if >0 then not allow any    inserts 
IF updating THEN
    run some code 
IF deleting THEN
    run some code 
end

6
COUNT 永远不会返回 NULL - Robby Cornelissen
1
我真的想不出这种情况,除非你在子查询中使用它并将其连接起来。然后它不再是COUNT(*),而只是记录集的一部分。 - Nick.McDermaid
3
也许你最好描述一下你真正想做什么。这样会比使用这些人为的例子获得更好的结果。 - Robby Cornelissen
1
您可能还想查看一下MSDN页面上关于ISNULL的说明,因为我认为您在评论中使用ISNULL(...) > 0的例子并不是它的正确用法。 - Matthew Haugen
2
请记住,查询永远不会返回NULL。列可能会返回NULL。查询可能不返回任何行(在这种情况下,COUNT将返回0)。 - Nick.McDermaid
显示剩余10条评论
3个回答

3
DECLARE @ErrorMsg nvarchar(400)
IF (SELECT count(*) FROM tbl1) = 0
BEGIN
    SET     @ErrorMsg = 'You are returning nothing'
    SELECT  @ErrorMsg Err
    RETURN 
END
Else IF (SELECT count(*) FROM tbl1) >= 1
BEGIN
    SET     @ErrorMsg = 'You are returning something'
    SELECT  @ErrorMsg Err
    RETURN 
END

从计数中得不到空值,因此如果您检查为0,那就相当于等价物。

else if检查计数器返回的任何内容

您也可以使用IF EXISTS

IF EXISTS   (
        SELECT 1 FROM tbl1
)
BEGIN
    SET     @ErrorMsg = 'You are returning something'
    SELECT  @ErrorMsg Err
    RETURN 
END

1
如果您只关心“0”和“至少1”,通常应使用EXISTS而不是强制服务器执行完整计数。 - Damien_The_Unbeliever
好的,我也加了一个“如果存在”的语句:p - ByronMcGrath
这两个代码块都不正确。第一个甚至无法运行。你会得到语法错误。为什么要接受它呢? - Nick.McDermaid
1
是的,第一段代码现在可以工作了,因为你已经进行了编辑。第二段代码仍然不能像你描述的那样运行,因为 NOT EXISTS (SELECT count(*) FROM tbl1) 总是 FALSE。你现在可能需要对此部分进行编辑。 - Nick.McDermaid
1
如果存在(SELECT count(*) FROM tbl1)始终返回true。: |。不要紧。这个问题是一场灾难,而且原帖已经消失了。 - Nick.McDermaid
显示剩余2条评论

1
如果您正在编写触发器,通常不需要检查伪表中是否存在任何内容,只需根据伪表编写代码即可。另请注意,Oracle触发器按行执行,而SQL Server触发器仅调用一次,并可能在伪表中有多条记录。
因此,在您的触发器中,您可以这样做:
INSERT INTO AnotherTable (Col1,Col2) SELECT Col1,Col3 FROM INSERTED

INSERTED 是一个伪表。它包含所有被插入(或更新)的记录。这里可能有 0、1 或多个记录。

如果没有任何记录,此代码将不会插入任何内容。

回到您最初的问题,检查是否没有行的最佳方法是执行以下操作:

IF EXISTS (SELECT 1 FROM INSERTED)
BEGIN
-- Some Code
END

或者,在触发器中,您可以简单地指定触发器对于UPDATE或INSERT根本不触发。

0
select FOUND_ROWS();

将返回由选择查询选定的记录数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接