Это дорогой и расточительный сначала сделать подсчет, а затем выполнить обновление.По сути, вы собираетесь сделать два сканирования вместо одного, если счет вернется> 0. Даже использование существует вместо счетчика может быть не менее эффективным, но это может быть так же плохо.Почему бы просто не попробовать запустить обновление?Вам нужно выбрать какое-нибудь значение токена для сравнения, чтобы число, которое никогда не могло существовать в данных естественным образом.Или вы можете выполнить много условий в OR.
CREATE PROCEDURE dbo.MyTable_Update
@ID INT,
@Value1 DECIMAL(5,2),
@Value2 DECIMAL(5,2)
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.MyTable
SET Value1 = @Value1,
Value2 = @Value2
WHERE
ID = @id
AND
(
COALESCE(Value1, -1) <> COALESCE(@Value1, -1)
OR COALESCE(Value2, -1) <> COALESCE(@Value2, -1)
);
SELECT 'Rows updated:', @@ROWCOUNT;
END
GO
А вот версия, которая использует больше условий, но избегает необходимости выбирать какое-либо значение токена, например -1:
CREATE PROCEDURE dbo.MyTable_Update
@ID INT,
@Value1 DECIMAL(5,2),
@Value2 DECIMAL(5,2)
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.MyTable
SET Value1 = @Value1,
Value2 = @Value2
WHERE
ID = @id
AND
(
Value1 <> @Value1
OR (Value1 IS NULL AND @Value1 IS NOT NULL)
OR (Value1 IS NOT NULL AND @Value1 IS NULL)
OR Value2 <> @Value2
OR (Value2 IS NULL AND @Value2 IS NOT NULL)
OR (Value2 IS NOT NULL AND @Value2 IS NULL)
);
SELECT 'Rows updated:', @@ROWCOUNT;
END
GO
Ключ в том, чтобы сначала не подсчитывать счетчик, просто чтобы увидеть, стоит ли запускать запрос на обновление.Просто запустите запрос на обновление.В худшем случае вы обновите 0 строк, но по крайней мере вы сделаете это только за один проход.