I would create One stored procedure with optional parameters. Also instead of using
WHERE @Var is NULL or Column = @Var use dynamic sql to build your query.
This kind of query where clause results in a very unefficient execution plan.
Also Sql server doesn't do any shortcircuting when evaluating OR conditions in where clause, for example even if @Var is null evaluates true sql server may still go ahead with the other Or condition and starts evaluating the whole column against a null variable.
Also with these optional parameters, if you pass a specific set of parameters and there is no execution plan for this procedure in the proc cache sql server will create an execution plan best for these specific set of parameters and uses it, but what if you pass a very different set of parameters on the next execution of this procedure, sql server looks into the proc cache and if it find an execution plan there it just goes ahead and uses that execution plan, even though it was a good execution plan for the first set of params passed but a very bad execution plan for these very different set of params (known as Parameter sniffing).
Using dynamic sql also eliminates this parameter sniffing since it stores parameteised execution plans.
I would use one procedure with dynamic sql something like this...
CREATE PROCEDURE dbo.usp_ProcName
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N' select id
from dbo.Customers WHERE 1 = 1'
+ CASE WHEN @Name IS NOT NULL
THEN N' AND Name = @Name' ELSE N' ' END
+ CASE WHEN @FirstName IS NOT NULL
THEN N' AND FirstName = @FirstName' ELSE N' ' END
+ CASE WHEN @City IS NOT NULL
THEN N' AND City = @City' ELSE N' ' END
+ CASE WHEN @Birthday IS NOT NULL
THEN N' AND BirthDay LIKE ''%'' + @Birthday + ''%''' ELSE N' ' END
EXECUTE sp_executesql @Sql
,N'@Name VARCHAR(100) , @FirstName VARCHAR(100)
@City VARCHAR(100), @BirthDay VARCHAR(100)'