不少開發人員在進行SQL拼接時頭痛之極,不知道如何進行拼接操作才會更安全又不影響性能,下面我以存儲過程為例與大家分享一個相對比較安全高效的方法
簡介:存儲過程(Stored Procedure)是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集,存儲在數據庫中,經過第一次編譯后再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。
格式:
CREATE PROCEDURE [擁有者.]存儲過程名
[(參數#1,…參數#1024)]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
]
[FOR REPLICATION]
AS 程序行
其中存儲過程名不能超過128個字。每個存儲過程中最多設定1024個參數
(SQL Server 7.0以上版本),參數的使用方法如下:
@參數名數據類型[VARYING] [=內定值] [OUTPUT]
案例:
需求:1、查詢一張圖片表中前10筆圖片信息
條件:1、按圖片類型(imgtype)添加人員編號(agentID)
2、若圖片類型參數為空(NULL)查詢所有類型
3、若添加人員參數為空(NULL)查詢所有人員
下面我們來分析一下我們經常使用的兩種不同寫法 會帶來什么樣的結果有什么樣的不足之處
寫法一:(不推薦)
優勢:一、閱讀或寫法簡單符合面向過程思路,大多數程序員都喜歡
不足:一、無法防止SQL注入問題;(防SQL注入核心方法:參數化)
二、影響性能(這種寫法參數無法確定導致每次調用時都會重新編譯)
三、無法避免特殊符號的影響
寫法二:(不推薦)
優勢:1、代碼量少,閱讀簡單
2、防止了SQL注入問題
不足:1、隱藏了一個定時炸彈(非常可怕的東西)
1.1、當資料和參數為NULL時 查詢條件變成了 NULL=NULL,NULL=NULL真的成立嗎?
現在大家應該明白原因了吧,此方法容易導致數據丟失(目前查詢中的資料顯示 NULL=NULL成立與否跟SQL服務器配置有關,對於這種時對時錯的方式最好不用,否則找問題你會后悔死的)
2、大數據下此寫法性能非常低(丟失了索引鍵)
2.1、使用存儲過程原因(1、提高性能,2、安全,3、邏輯業務.....)大數據下提高查詢性能(除硬件,架構..之外),建立索引是非常重要的但是寫法不同
會導致索引建丟失 分析一下:
反而這種寫法性能更高
寫法三:(推薦)
優勢:一、閱讀或寫法簡單符合面向過程思路,大多數程序員都喜歡
二、參數化解決SQL注入問題
三、一次編譯通過無需再次編譯
四、利用了索引功能(提升性能)
五、防止了特殊符號的影響
