В зависимости от ситуации, я бы, вероятно, использовал динамический SQL.
Однако вы должны помнить об SQL-инъекции в случае, если @param исходит от пользователя, поэтому никогда не следует добавлять параметр непосредственно в sql.
В t-sql это выглядело бы примерно так (из моей головы и не проверялось;):
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'
SELECT ...
FROM table t
WHERE 1 = 1' (
IF(@param IS NOT NULL)
SET @SQL = @SQL + '
AND t.id = @id'
... possibly more things added to the query ...
EXEC sp_executesql
@SQL
, '@id AS INT'
, @id = @Param
Сделав это, вы получите оптимизированный план запросов для каждого случая (и с помощью sp_executesql также будет использоваться кэш запросов)
Я бы особенно избегал решения OR, если вы проверяете планы запросов, сгенерированные с помощью OR, по сравнению с планами без, вы поймете почему.