仅使用函数值更新似乎只评估函数一次

时间:2010-07-07 03:32:46

标签: sql sql-server

我正在尝试使用如下语句将INT列中的所有NULL更改为递增值:

UPDATE [TableName] SET [ColumnName] = dbo.FunctionName() WHERE [ColumnName] IS NULL

其中函数如下所示:

CREATE FUNCTION FunctionName() RETURNS INT AS
BEGIN
    RETURN (select MAX(ColumnName) + 1 from TableName)
END

但结果是所有NULL值现在都设置为相同的值(即在调用语句之前,大于 1)。

这是预期的行为吗?如果是这样,我将如何获得我追求的结果?

我想避免使用自动增量列,因为我真正想要的只是唯一性,增量只是达到目的的一种方式。

1 个答案:

答案 0 :(得分:4)

是的,这是设计使然,它被称为Halloween protection。要实现您想要的(一次),请使用可更新的CTE:

with cte as (
SELECT Column,
ROW_NUMBER() OVER () as rn
FROM Table
WHERE Column IS NULL)
UPDATE t
SET t.Column = m.max + t.rn
FROM cte t
JOIN (
SELECT MAX(Column) as max 
FROM Table) m;