Updating a table with millions of records, its been 4 days
This query requires you to scan every row in the table because


I guess procodet or ProviderCode are not indexed
Even if they were indexed, you have a LEFT which is a function on a WHERE predicate
And you have COLLATE too which is effectively a function on a WHERE predicate


"a function on a WHERE predicate" means indexes won't be used

If you batch it (say on UPDATE TOP (10000) ... AND costPercentage IS NULL) then you need an index on costPercentage and this assume you are setting it.

The only solutions I see are


populate a new table in batches, based on, say, the primary key
create indexed, computed columns to hide the LEFT and COLLATE expressions, then run the update