我正在使用ODBC在SQL Server 2008上运行此查询。如果我拿出最后一部分(或者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中传递。
答案 0 :(得分:1)
分而治之。从具有硬编码值的T-SQL开始,包括NULL和非null。从最简单的查询和构建开始,在每个步骤检查查询计划。你可能会发现你有索引问题等等。解决它然后回到代码。
如果没有更多的架构信息(表格布局,索引等),只需查询就很难提供帮助。
答案 1 :(得分:0)
在ssms中运行需要多长时间?如果您可以在启用执行计划的情况下运行查询(查询菜单,执行计划 - 而不是估计的执行计划。)如果存在索引问题,则应在执行计划窗格中通知您。
你或你的dba可以运行SQL分析器吗?并捕获实际传递到sql server的内容,以确认它符合您的预期。
答案 2 :(得分:0)
我认为您可以重构查询以提高性能:
SELECT COUNT(*) FROM dbo.POITEMST li
WHERE li.DATEGENERATED >= ISNULL(?,'1753-02-02')
AND li.DATEGENERATED >= ISNULL((SELECT MAX(t.DATEGENERATED) FROM dbo.POITEMST t WHERE t.PONUM = ?), '1753-02-02')
将与null的比较与OR相结合似乎是问题的一部分。
希望这有帮助,
比尔
答案 3 :(得分:0)
执行以下操作:
根据我的经验,当遇到同一查询的SSMS和ODBC之间的性能差异时,索引会产生巨大的差异。