Dean,Ive had success using a GUID stored in a process_id column to "lock" the row. Heres a simple example:SET NOCOUNT ONDECLARE @table TABLE (test_id INT, test_name VARCHAR(15), process_id UNIQUEIDENTIFIER)INSERT INTO @tableSELECT 1, 'Nathan', NULL UNION SELECT 2, 'Dean', NULL UNION SELECT 3, 'Michael', NULLDECLARE @process_id UNIQUEIDENTIFIER, @row_count INT, @error_code INTSELECT @process_id = NEWID(), @row_count = 1----------------------------------------------------- mark rows for processing---------------------------------------------------SET ROWCOUNT @row_countUPDATE @tableSET process_id = @process_idWHERE process_id IS NULLSET ROWCOUNT 0----------------------------------------------------- perform your processing here ---------------------------------------------------UPDATE @tableSET test_name = UPPER(test_name)WHERE process_id = @process_idSELECT @error_code = @@error----------------------------------------------------- if fails nullify process_id so it can picked up again---------------------------------------------------IF @error_code <> 0 BEGIN UPDATE @table SET process_id = NULL WHERE process_id = @process_idENDSELECT * FROM @table