Dynamic SQL will normally take a performance hit because it can't cache the query plan inside SQL server.
I personally prefer Approach 1 too but if it's not done right then it can be very slow, particularly since open ended LIKE statements such as var LIKE "%text%" can take huge quantities of time to execute.
My suggestion would be to have the input parameters have default values of null and then structure your WHERE clause as follows
SELECT *
FROM table t
WHERE t.column1 = ISNULL(@param1, t.column1)
AND t.column2 = ISNULL(@param2, t.column2)
This means that in the instance where the parameter is not provided it simply returns all other matching results.
You may have to do something clever for date range matching however by using the minimum and maximum possible date / time where the parameter is NULL to ensure that all records should be in the range.