Я думаю, это просто, если ваш запрос неверен.
Давайте рассмотрим пример предоставления только @StartTime.Ваш запрос оценивается следующим образом:
SELECT * FROM Order
WHERE CreatedOn > CAST(@StartTime as datetime)
AND CreatedOn < null
AND Order.OrderStatusID = null
AND Order.CustomerEmail = null
Если предположить, что значения ANSI NULL включены, нет значения, которое по сравнению с нулем возвращает истинный результат, следовательно, ваш пустой набор результатов.ответ самый близкий - я бы предложил:
SELECT * FROM Order
WHERE (@StartTime is null or CreatedOn > @StartTime)
AND (@EndTime is null or CreatedOn < @EndTime)
AND Order.OrderStatusID = isnull(@OrderStatusID, Order.OrderStatusID)
AND Order.CustomerEmail = isnull(@CustomerEmail, Order.CustomerEmail)
marc_s также является правильным - если вы явно хотите установить значение параметра @ равным SQL null, установите его как
commAdvanced.Parameters.Add("@CustomerEmail", SqlDbType.nvarchar).Value = DBNull.Value;
commAdvanced.Parameters.Add("@OrderStatusID", SqlDbType.Int).Value = DBNull.Value;
Однако,поскольку вы указали значения по умолчанию, равные null, в вашем сохраненном протоколе (кроме @OrderStatusID - typo?) , вам вообще не нужно добавлять эти параметры в команду.