 <p>For low volumes only, yes</p> <p>You're better to try to INSERT and UPDATE on error. You can assign values with the OUTPUT clause</p> <pre><code>DECLARE @stuff TBLE (...) BEGIN TRY ... BEGIN TRY INSERT table1 OUTPUT ... VALUES ...() END TRY BEGIN CATCH IF ERROR_NUMBER = 2627 UPDATE table1 SET ... OUTPUT ... ELSE RAISERROR ... END CATCH ... END TRY BEGIN CATCH ... END CATCH </code></pre> <p>Edit:</p> <p>Several other answers from me:. Hopefully you get the idea.</p> <ul> <li><a href="http://stackoverflow.com/questions/3407857/only-inserting-a-row-if-its-not-already-there/3408196#3408196">Only inserting a row if it&#39;s not already there</a></li> <li><a href="http://stackoverflow.com/questions/3593870/select-insert-version-of-an-upsert-is-there-a-design-pattern-for-high-concurre/3594328#3594328">Select / Insert version of an Upsert: is there a design pattern for high concurrency?</a></li> </ul>