Sql-Server
強制參數化和 CASE 語句
我們有一個使用 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 列表中包含了文字。
不過,如果有人對解決此問題有任何建議,我會很感興趣。