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返回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 而没有声明另一个变量?最简单的方法是什么?

4

3 回答 3

6

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

因此,如果您没有,我认为它不会返回任何内容,因为此语句没有输入行:

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

(如果你 SELECT * from @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 的 insie 语句将为 NULL,所以这里是诀窍。如果某些内容被删除,那么 ID 将在那里。我希望它有所帮助。

于 2012-08-27T05:25:58.783 回答
1

您可以使用派生表,该表将返回一行,-1然后执行outer applyon @result

select isnull(R.Id, T.Id) RetValId
from (values(-1)) as T(Id)
  outer apply @result as R
于 2012-08-27T05:48:40.007 回答
0

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

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

IF @@ROWCOUNT = 0
    return null
return 1589
于 2012-08-27T05:46:13.237 回答