You're on the right track. Query string parameters are just strings. So you have to choose a string representative for NULL which won't conflict with any of the actual string values you will be sending. You could use empty string, "null", or "Thomas's special null flag"; it doesn't matter. There is no "official" representation of NULL in a query string parameter.
Update: no, I don't think the stored procedure is the place to handle this translation. The reason is that the fact that you are converting your string representation of the null in the query string parameter to a "real" null is something that you have to do because of the limitations of what you can put into a query string parameter. Doing this conversion in the stored procedure would make the procedure, to some degree, "aware" of the query string, and that doesn't feel right. Instead, I would do it in the aspx markup, which is expected to be web-aware. Here's a source example (untested, so fix my syntax errors or, better, change to string.Format() or a parameterized query...
Change:
QueryToJSON(conn, "execute WebGetEmployeesPlanned'"
+Request.QueryString("customercode")+"',
'"+Request.QueryString("lang")+"',
'"+Request.QueryString("date")+"'").flush
to:
QueryToJSON(conn, "execute WebGetEmployeesPlanned "
+ (string.IsNullOrEmpty(Request.QueryString("customercode")) ?
"null, '"
:
"'" + Request.QueryString("customercode") + "','")
+Request.QueryString("customercode")+"',
'"+Request.QueryString("lang")+"',
'"+Request.QueryString("date")+"'").flush