Sql-Server

如果存在 - 選擇防止重複程式碼

  • June 28, 2018

我們收到一個訂單列表,並驗證它以某些前綴開頭,例如,如果 OrderNumber 不以 ABC 開頭,則將訂單列表顯示為錯誤給使用者。我們使用exists,來搜尋第一個存在,不想消耗太多的性能時間。如果不存在,那麼我們可以開始在程式碼中執行其他任務。

sql中是否有擺脫重複程式碼的方法?我們在多個表上進行了許多這樣的檢查,試圖讓程式碼更有效率。

if exists
(
   select *
   from dbo.OrdersImport
   where left(OrderNumber,3) <> 'ABC'
)
begin
   select OrderNumber as OrderErrorList
   from dbo.OrdersImport
   where left(OrderNumber,3) <> 'ABC'
end
else

不幸的是,我擔心通過嘗試防止重複程式碼,您最終可能會編寫更多程式碼並使查詢的可讀性降低。但我相信這對你來說是有利的——考慮到在測試中你只需要在一個或兩個表中搜尋的情況,為了檢索所有的細節你必須加入更多的表。在這些情況下,您可以簡化測試查詢,從而使它們更快地執行。

在我們這樣做的同時,您也可以考慮更改您的 WHERE 語句。在謂詞中使用函式會使它們不是 SARGable 並阻止在這些情況下使用索引。此範例中更好的方法是檢查

WHERE OrderNumber LIKE 'ABC%'

因為優化器將執行轉換為類似於以下內容的內容

OrderNumber >= 'ABC' AND OrderNumber < 'ABD'

它支持使用索引。所以這將是索引掃描(使用left())與索引搜尋(使用LIKE)。

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