SQL Server 2008中的ISNULL函数无法正常工作

时间:2012-08-27 05:18:06

标签: sql sql-server sql-server-2008 tsql

假设这个脚本:

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时返回null(无),但是这个返回-1:

2

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

为什么呢?第一个脚本的问题在哪里?

更新

那么有没有办法检查Deleted Id是否为null返回-1如果没有返回Id而没有声明另一个变量?什么是最简单的方法?

3 个答案:

答案 0 :(得分:6)

如果您没有ID 1589的条目,那么在DELETED表中将没有记录,如果您有,那么它应该返回1589.

所以,如果你没有我认为它简单不返回任何东西,因为这个语句没有输入行:

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

(如果您从@result中选择SELECT *那么它应该没有行)

第二个返回-1,因为你首先设置了在select之后得到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,insie语句将为NULL,因此这是技巧。如果删除了某些内容,则ID将存在。 我希望它有所帮助。

答案 1 :(得分:1)

您可以使用派生的表格返回-1的一行,然后在outer apply上执行@result

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

答案 2 :(得分:0)

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

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

IF @@ROWCOUNT = 0
    return null
return 1589