- Это обновит всех клиентов, потому что у меня нет предложения WHERE, верно?
Да. Рассмотрите возможность добавления предложения WHERE, например:
WHERE Id IN (SELECT DISTINCT CustomerId FROM @CustomerBalances)
Это предотвращает обновление остатков, которые не изменились.
Это правильно обрабатывает случаи, когда у клиента есть несколько совпадающих строк в таблице @CustomerBalances, верно?
Да. Потому что вы используете SUM () для их агрегирования.
Требуется ли здесь предложение EXISTS?
Рекомендуется, а не обязательно. Рекомендуется обновлять сальдо только после архивации записей.
Будет ли SUM () возвращать 0 или NULL, если нет совпадающих строк?
Да, это ошибка, из-за которой для сальдо устанавливается значение NULL (или ошибка, если NULLне допускается) для клиентов, у которых не было заархивированных транзакций. Это будет исправлено добавлением предложения WHERE, указанного выше. Если вы по какой-то причине пытаетесь избежать ГДЕ, вы можете исправить это с помощью COALESCE (SUM (Сумма), 0,00)
Все ли вычищено, если у меня нет окончательного оператора DELETE?
Да. Когда процедура завершится, табличная переменная автоматически выйдет из области видимости, так что DELETE не нужен, насколько показывает этот фрагмент.
Крайне важно, чтобы в это время не вносились изменения в таблицу Транзакции или Клиенты. Имеет ли здесь смысл использовать TABLOCK?
Да, но вы должны также указать HOLDLOCK, чтобы сохранить блокировку до завершения транзакции.
Какие-либо предложения по поводу общего подхода, который я использую?
См. Выше, но в целом это выглядит разумным.