You could use SET ROWCOUNT xxx
to limit the number of rows affected by the update statement.
Something like this:
SET ROWCOUNT 500;
WHILE EXISTS (SELECT 1 FROM Instances WHERE thing = 'new thing')
BEGIN
BEGIN TRANSACTION;
UPDATE Instances
SET thing = 'new thing'
WHERE thing <> 'new thing';
COMMIT TRANSACTION;
CHECKPOINT;
WAITFOR DELAY '00:00:01'; --wait one second between loops
END
If your database is configured for simple recovery model, this will not require a huge amount of log space. However, if your database is in full recovery model, you'll probably want to take log backups periodically while this is taking place.
Microsoft Docs for SET ROWCOUNT
advise that it's a deprecated setting:
Using SET ROWCOUNT will not affect DELETE, INSERT, and UPDATE statements in a future release of SQL Server. Avoid using SET ROWCOUNT with DELETE, INSERT, and UPDATE statements in new development work, and plan to modify applications that currently use it. For a similar behavior, use the TOP syntax.
Having said that, It's not on the list of removed features at this point.