SQL Server 2008中的ISNULL函数不能正常工作

4
假设有以下脚本:
DECLARE @result TABLE(Id BIGINT);

DELETE FROM [Products].[Product]
OUTPUT DELETED.[Id] INTO @result
WHERE [Products].[Product].[Id] = 1589;

所以我继续尝试:
1.
SELECT CAST(ISNULL([Id], -1) AS BIGINT) AS N'RetValId' FROM @result;

[Id]为空时,返回null(无),但这个返回了-1:

2

DECLARE @mi BIGINT;
SET @mi = (SELECT [Id] FROM @result)
SELECT CAST(ISNULL(@mi, -1) AS BIGINT) AS N'RetValId'

为什么?第一个脚本有什么问题吗?

更新

那么有没有办法检查删除的ID是否为空,如果返回-1则返回ID,而不声明另一个变量?最简单的方法是什么?


1
如果你的第一个脚本实际上没有删除任何内容,DELETED将不包含任何行。ISNULL不会被调用。在第二个例子中,因为你正在执行子选择,ISNULL实际上会被调用。 - StuartLC
@marc_s,我没有任何ID为1589的“Product”,所以没有删除任何内容,也没有将任何内容插入到@result中,因此我期望第一个脚本的意思是:(SELECT CAST(ISNULL([Id], -1) AS BIGINT) AS N'RetValId' FROM @result;) 返回-1,但是什么也没有返回,为什么?第二个脚本为什么返回-1? - Saeid
1
@marc_s 看看这个 http://www.sqlfiddle.com/#!3/0d489/1 - Saeid
1
这正是关键所在:如果表中不包含任何行,则 SELECT 将不返回任何行,因此无法对列应用 ISNULL - 因为它不存在。 - marc_s
1
我更新了你的sqlfiddle。 http://www.sqlfiddle.com/#!3/0d489/2 这里是MAX([ID])的解决方案,您可以查看它的工作原理。 - András Ottó
3个回答

6

如果您没有ID 1589的记录,则在DELETED表中将没有任何记录,如果有记录,则应返回ID 1589。

因此,如果没有输入行,则该语句不会返回任何内容。

SELECT CAST(ISNULL([Id], -1) AS BIGINT) AS N'RetValId' FROM @result;

如果您从@result中选择*,那里不应该有任何行。

第二个返回-1是因为您将第一个设置为变量,在选择后获取了NULL值。

DECLARE @mi BIGINT;
SET @mi = (SELECT [Id] FROM @result)

(如果您选择@mi之后,那么它应该为NULL)

我认为这就是解释

更新:

也许您可以尝试一个小技巧来实现它,而无需使用其他变量:

SELECT CAST(ISNULL(MAX([ID]),-1) AS BIGINT) AS N'RetValId' FROM @result;

由于MAX函数,内部语句将为NULL,这里有一个技巧。如果某些内容被删除,则ID将存在。 希望这可以帮到你。

1
谢谢,那么有没有办法检查删除的ID是否为null,如果是则返回-1,如果不是则返回ID而不声明另一个变量?最简单的方法是什么? - Saeid
是的,您可以编写 IF SELECT COUNT(ID) FROM @result = 0 BEGIN SELECT -1 END ELSE BEGIN ..... END。这也是一种解决方案,只是有点长,但也有效。 - András Ottó

1

您可以使用派生表,返回一行带有-1的结果,然后在@result上执行outer apply操作。

select isnull(R.Id, T.Id) RetValId
from (values(-1)) as T(Id)
  outer apply @result as R

0

如果没有删除任何行,则返回null的简单方法是使用@@rowcount变量。它包含上一个操作影响的行数:

DELETE FROM [Products].[Product]
WHERE [Products].[Product].[Id] = 1589;

IF @@ROWCOUNT = 0
    return null
return 1589

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