Sql-Server

強制參數化和 CASE 語句

  • March 5, 2019

我們有一個使用 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 語句中的日期文字沒有。

為什麼是這樣?我錯過了什麼?我可以嘗試解決什麼問題?每次執行的文字都會改變,所以目前,即使強制參數化,每次執行我都會得到一個新的計劃。

所以在我發布這個之前我應該做更多的探勘。該限制在此頁面的深處進行了解釋: 強制參數化 | 微軟文件

具體來說,本節:

任何 SELECT 語句的 <select_list>。這包括子查詢的 SELECT 列表和 INSERT 語句中的 SELECT 列表。

這告訴我這不是特定的 CASE,而是我在 SELECT 列表中包含了文字。

不過,如果有人對解決此問題有任何建議,我會很感興趣。

引用自:https://dba.stackexchange.com/questions/231331