Sql Server 的參數化查詢


為什么要使用參數化查詢呢?參數化查詢寫起來看起來都麻煩,還不如用拼接sql語句來的方便快捷。當然,拼接sql語句執行查詢雖然看起來方便簡潔,其實不然。遠沒有參數化查詢來的安全和快捷。

 

今天剛好了解了一下關於Sql Server 參數化查詢和拼接sql語句來執行查詢的一點區別。

參數化查詢與拼接sql語句查詢相比主要有兩點好處:

    1、防止sql注入 

    2、 提高性能(復用查詢計划)

首先我們來談下參數化查詢是如何防止sql注入的這個問題吧。

防注入例子:

  拼接sql語句:

("select * from user where name={0}",username)

或者

("select * from user where name="+username)

當 name傳進來是一個'aa';Truncate Table user 的時候,這樣會導致直接清除整個表數據

"select * from user where name='aa';Truncate Table user


  我們使用參數化的時候: 

("select * from user where name=@username",new {username=username})


這時候即使我們傳進來的是'aa';Truncate Table user ,數據庫端也會把這些當做字符串處理,執行的sql語句會變成

select * from user where name=''aa';Truncate Table user '

實際上把'aa';Truncate Table user 這個當做了name的值做查詢條件了

以上就是一個簡單的例子介紹關於參數化查詢如何防止sql注入。

再看到底是如何提高性能的呢?

復用查詢計划:

select * from AU_User where Id=1
select * from AU_User where Id=2

Sql Server在執行一條查詢語句之前都對對它進行“編譯 ”並生成“查詢計划”,上面兩條查詢語句生成的查詢計划就是兩條不一樣的查詢計划,在下面這張圖片當中我們可以去嘗試下執行這兩條sql語句

,結果顯而易見會生成兩條查詢計划,Id后面所接的參數不一致。

 

 

 

 

 

 

 

 

 

 

 

 

 

然后我們再來看看使用參數化查詢

select * from AU_User where Id=@Id


這樣不管你傳的參數是多少,執行編譯生成的查詢計划都是 select * from AU_User where Id=@Id,這樣可以實現查詢計划的復用,並不需要同一個查詢去生成多個查詢計划
完全可以節省其中生成查詢計划的時間

 

 

歡迎大家掃描下方二維碼,和我一起學習更多的知識😊

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM