只要沒有其他聯接必須動態地檢查參數的值可能很重要,並且唯一的動態部分是WHERE子句,這可能會以及具有所有可能參數的靜態查詢。所以你有以下情況:
如果你想檢查一切可能的值(負數/零/零/正/空字符串/等),需要使用輔助參數,如@ signifficant_param1 ,以及@ param1的原始值。
[...]
WHERE
(@signifficant_param1=0 or (@param1 is null and field1 is null) or @param1=field1)
AND (@signifficant_param2=0 or (@param2 is null and field2 is null) or @param2=field2)
//etc
[...]
這是我能想象到的最普遍的條款。 基本上它會驗證@signifficant_param
的值。如果應該考慮這個參數,它將是1,條件的第一部分將是錯誤的,並且第二部分(參數的驗證)將會發生。在第二階段,如果@param
爲空,那麼您正在查找所有空值field
,並且您無法將null與null比較,因爲它們不相等。然後發生常規非空值匹配的驗證。
如果,另一方面,在field
值不能爲空,或者不能爲負數,您不需要@signifficant_param
,因爲你可以做一個規則,例如,如果@param
爲null ,那麼這個值是不是signifficant(前面的情況,你會搜索所有空值代替),你可以使用以下命令:
[...]
WHERE
field1=case when @param1 is null then field1 else @param1 end --first way with case statement
and (@param2 is null or [email protected]) --second way with boolean logic
[...]
我們在我們的項目中有複雜的查詢,這需要「WHERE」子句中的很多參數。我們的dba傾向於對這些情況進行動態查詢,但我對此並不滿意。恕我直言,只要需要採取措施防範參數嗅探,靜態查詢應該更快。有沒有人對KuldipMCA的問題有很好的回答,這樣我可以讓我們的高級DBA停止支持動態查詢? – Cagdas 2010-05-11 07:41:10