我们有一个使用 ORM 的应用程序,它不(容易)支持参数化查询。为了解决这个问题,我在我们的数据库 (SQL2008 R2) 上启用了强制参数化以避免缓存膨胀,并鼓励计划重用。
一个更复杂的查询没有被完全参数化,我已经将其缩小到 CASE 语句中使用的文字值:
SELECT
CASE WHEN auth_date > '2019-02-03 08:48:03' THEN authorisations.authorisation_amount END
FROM authorisations
WHERE auth_date > '2019-02-03 07:48:03'
AND merchant_id = 400000000031
(这个查询可能看起来不直观,但它是一组更大的嵌套子查询的片段,我们必须在最底层使用这个结构。这作为一个例子。)
查询计划使用的参数化语句为:
StatementText="select case when auth_date > '2019-02-03 08:48:03' then authorisations . authorisation_amount end from authorisations where auth_date > @0 and merchant_id = @1"
您会注意到 WHERE 子句中的文字已被参数化,但 CASE 语句中的日期文字尚未参数化。
为什么是这样?我错过了什么?我可以尝试解决这个问题吗?每次执行都会更改文字,所以目前,即使强制参数化,我最终也会为每次执行制定一个新计划。