It's easier to put this code in a new answer rather than a comment, but this shows a bit of what Remus is saying:
CREATE PROCEDURE dbo.Test_Params
@param1 INT
WITH RECOMPILE
AS
BEGIN
SELECT
o.object_id,
c.object_id
FROM
sys.objects o
LEFT OUTER JOIN sys.columns c ON
c.object_id = o.object_id AND
@param1 = 1
OPTION
(RECOMPILE)
END
GO
EXEC dbo.Test_Params 1
EXEC dbo.Test_Params 2
If you do an execution plan on the two EXEC statements, you'll see that sys.columns appears in both execution plans, but in the second the rows are all filtered before the join takes place. Notice that they are not short-circuited out of the query entirely though.