Sql Server 的引數化查詢

2021-09-18 03:31:10 字數 1439 閱讀 6400

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

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

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

1、防止sql注入

2、 提高效能(復用查詢計畫)

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

防注入例子:

拼接sql語句:

("select * from user where name=",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 )

這時候即使我們傳進來的是』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,這樣可以實現查詢計畫的復用,並不需要同乙個查詢去生成多個查詢計畫

完全可以節省其中生成查詢計畫的時間

引數化查詢

一 using system using system.collections.generic using system.linq using system.text using model using system.data.sqlclient using system.data namespac...

SqlServer查詢優化檢視引數

sqlserver查詢優化檢視引數 1.set ststistics time on 結果cpu time elapsed time,即cpu時間 占用時間。解釋 表示執行這次查詢使用了多少cpu執行時間和執行查詢使用了多少時間。cpu執行時間是對執行查詢所需要的cpu資源的一種相對穩定的測量方法,...

MSSQL的IN引數化查詢

e02 例如 原sql語句 delete from serviceboard where charindex cast id as nvarchar ids 0 注 id 在資料庫中為整型,要匹配字串必須轉換成nvarchar 現在修改為 delete from serviceboard where...