Well, if you use an ad hoc query, instead of a stored proc, it's easy enough:
Use value="" for the defaults:
<SELECT name="dd1">
<OPTION value=0>Any</OPTION>
<OPTION value=1>First</OPTION>
<OPTION value=2>Second</OPTION>
...
And then build up the SQL (example in VBScript code, but any language similar):
<%
SQL = "SELECT * FROM table WHERE 1=1 "
dd = CLNG(Request("dd1"))
If dd > 0 Then SQL = SQL & " AND dd1=" & dd
dd = CLNG(Request("dd2"))
If dd > 0 Then SQL = SQL & " AND dd2=" & dd
dd = CLNG(Request("dd3"))
If dd > 0 Then SQL = SQL & " AND dd3=" & dd
But if you want to use a stored proc you need to get trickier.
Code:
CREATE PROC demo
@dd1 INT, @dd2 INT, @dd3 INT
AS
SELECT * FROM table
WHERE ( CASE WHEN @dd1 = 0 THEN dd1 ELSE @dd1 ) = dd1
AND ( CASE WHEN @dd2 = 0 THEN dd2 ELSE @dd2 ) = dd2
AND ( CASE WHEN @dd3 = 0 THEN dd3 ELSE @dd3 ) = dd3
Lots of other ways to do this, I'm sure, but that should work.