1 回答

TA貢獻1811條經(jīng)驗 獲得超4個贊
優(yōu)點
SQL 在存儲過程中的優(yōu)點是:
抽象,您可以在不更改 .net 應用程序的情況下重構(gòu)數(shù)據(jù)庫
安全性,您可以通過設置正確的執(zhí)行權(quán)限來進行更好的安全檢查。您也可以限制數(shù)據(jù)集不輸出安全意識信息。
透明度:對數(shù)據(jù)庫執(zhí)行了哪些查詢?
查詢查詢的優(yōu)化,使用正確的索引等。
缺點
存儲過程中動態(tài) SQL 的缺點:
動態(tài) SQL(在 SQL 服務器中)在安全性和性能方面可能很棘手。
安全
SQL Server 防止注入的“工具”較少。變量不能隨處使用,所以只有當你硬編碼所有按選項排序的時候,你才是安全的。但是對于動態(tài)過濾,這可能很困難。
例如這是安全的:
posts?=?context.Posts?? ????.FromSql("SELECT?*?FROM?mytable") ????.OrderByDescending(p?=>?p.CreateDate)
這是不安全的(是的,有更好的寫法):
declare?varchar(200)?@orderby?=?'createDate?DESC' SET?@sqlCommand?=?'SELECT?*?FROM?mytable?ORDER?by?+?'@orderby EXEC?(@sqlCommand)
因此,您需要列出所有選項或選中所有選項。
表現(xiàn)
在性能方面,存儲過程中的動態(tài) SQL可能會出現(xiàn)問題。返回非常動態(tài)數(shù)據(jù)的存儲過程可能會選擇錯誤的查詢計劃,性能不佳。
*
您可以重新編譯每個存儲過程調(diào)用,但這也有缺點。
表值函數(shù)
另一種選擇是使用表值函數(shù) (TVF)。這些比存儲過程更受限制,但它們返回一個表,您可以對其進行分頁和排序。
如上所述,它們具有存儲過程的優(yōu)點,但沒有數(shù)據(jù)庫中動態(tài) SQL 的缺點!
示例 TVF 和 EF Core
有一個很好的表值函數(shù)和 EF 示例,
.NET Core 與 TFV GetMatchingPostByTitle
posts?=?context.Posts?? ????.FromSql("SELECT?*?FROM?dbo.GetMatchingPostByTitle({0})",?searchTerm) ????.Where(p?=>?p.BlogId?==?1) ????.OrderByDescending(p?=>?p.CreateDate) ????.ToList();
將生成此 SQL:
- 1 回答
- 0 關注
- 134 瀏覽
添加回答
舉報