Я выполняю этот запрос на SQL Server 2008 с использованием ODBC. Если я удалю последнюю часть (ИЛИ li.DATEGENERATED> = (...))), я не получу сообщение об ошибке ... но могу запустить ее в SSMS.
SELECT COUNT(*) FROM dbo.POITEMST li
WHERE (? IS NULL OR li.DATEGENERATED >= ?)
AND (? IS NULL OR (li.DATEGENERATED >= (
SELECT MAX(t.DATEGENERATED) FROM dbo.POITEMST t WHERE t.PONUM = ?)))
Вот как я настраиваю параметры
DbParameter startDateParam = cmd.CreateParameter();
startDateParam.ParameterName = "StartDate";
startDateParam.Value = (StartDate.HasValue ? (object)StartDate.Value : (object)(new DateTime(1753, 2, 2)));
cmd.Parameters.Add(startDateParam);
startDateParam = cmd.CreateParameter();
startDateParam.ParameterName = "StartDate";
startDateParam.Value = (StartDate.HasValue ? (object)StartDate.Value : (object)(new DateTime(1753, 2, 2)));
cmd.Parameters.Add(startDateParam);
DbParameter startPoParam = cmd.CreateParameter();
startPoParam.ParameterName = "StartPO";
startPoParam.DbType = DbType.String;
startPoParam.Value = (string.IsNullOrEmpty(StartPurchaseOrder) ? (object)DBNull.Value : (object)StartPurchaseOrder);
cmd.Parameters.Add(startPoParam);
startPoParam = cmd.CreateParameter();
startPoParam.ParameterName = "StartPO";
startPoParam.DbType = DbType.String;
startPoParam.Value = (string.IsNullOrEmpty(StartPurchaseOrder) ? (object)DBNull.Value : (object)StartPurchaseOrder);
cmd.Parameters.Add(startPoParam);
РЕДАКТИРОВАТЬ: эти даты только там, потому что я пытался выяснить это ... он проходил в DBNull раньше, если не было даты начала.