I came across a great post with same title by Narayana Vyas Kondreddi at http://vyaskn.tripod.com/differences_between_set_and_select.htm. Great info, very well presented.
Below are some key points from the article:
1. SET is the ANSI standard way of assigning values to variables, and SELECT is not.
2. You can use SELECT to assign values to more than one variable at a time. SET allows you to assign data to only one variable at a time
— Declaring variables
DECLARE @Variable1 AS int, @Variable2 AS int
— Initializing two variables at once
SELECT @Variable1 = 1, @Variable2 = 2
— The same can be done using SET, but two SET statements are needed
SET @Variable1 = 1
SET @Variable2 = 2
3. The system variables @@ERROR and @@ROWCOUNT must be captured in one statement, immediately after a data manipulation (DML) statement like INSERT, UPDATE, DELETE, or else, these system variables get reset to 0.
So, to get the right values and avoid complex workarounds, use SELECT in this case, instead of SET
4. When using a query to populate a variable, SET will fail with an error, if the query returns more than one value, but SELECT will assign one of the returned rows and mask the fact that the query returned more than one row. As a result, bugs in your code could go unnoticed with SELECT.
5. Based on Narayana’s performance testing, there is no performance difference between SET and SELECT when one variable is used. However, a single SELECT statement assigning values to 3 different variables is at least twice as fast compared to SET.