我正在尝试使用如下语句将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)。
这是预期的行为吗?如果是这样,我将如何获得我追求的结果?
我想避免使用自动增量列,因为我真正想要的只是唯一性,增量只是达到目的的一种方式。
答案 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;