[SQL ] 請問大家關於WHERE子句的問題
資料庫名稱:SQL Server 2000
資料庫版本:sp3
內容/問題描述:
以往我將前端的Method(例如ASP.NET資料存取層的Method)
對應到SQL Statement(或預存程序)時
都是採用下列方法
---------------------------------------------
抓取學生資料的Method => GetDataByStudentID(int StudentID)
對應的SQL Statement就像以下例子一樣
SELECT *
FROM TABLE
WHERE StudentID = @StudentID
---------------------------------------------
@StudnetID是傳進去的參數
但我現在遇到了一個問題
就是如果我所使用的Method
有使用兩個以上的過濾條件時候
而且這兩個過濾條件不一定得出現
這時候如果SQL Statement預先把WHERE子句寫死了
就有點糟糕了
例如抓取男生 身高為160的學生資料 => GetDataBySexAndHeight("男", 160)
對應的SQL statement會是如下
SELECT *
FROM TABLE
WHERE Sex='男' AND Height=160
如果今天我想要利用同樣的一個Method
但不設限任何條件 也就是要抓出所有的資料 Method裡面的參數就會是空的
GetDataBySexAndHeight("", "")
而因為SQL statement的WHERE子句已經寫死了
產生出的SQL code就會如下
SELECT *
FROM TABLE
WHERE Sex='' AND Height=''
這個SQL statement很明顯一看就知道是錯的
無法選出所有的資料
上述的例子只有兩個參數
每個參數都有出現 與不出現兩種可能
所以如果要每種可能的組合都寫一個method
就會2x2=4種method
參數越多 method就得跟著越多 顯然用method來對應不是一個好辦法
而我會有這個需求的原因是
.NET希望programmer利用參數來執行SQL指令
如果自己用字串相加的話
怕會有SQL injection的問題
所以雖然可以使用動態產生出WHERE子句 再將其合併到原先的SQL statement
但在ASP.NET裡面並不是很恰當的作法
而我目前利用的方法
是使用ADO.NET的DataView中的RowFilter字串
設定這些WHERE子句
功能上是可以滿足我的需求
但有兩個缺點
第一是存取資料的邏輯就跑出資料庫的範圍了
第二是如此一來就得先撈回所有資料 再使用DataView去過濾掉不要的資料
請問大家還有其他解法嗎 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.109.169.200
※ 編輯: seagal 來自: 140.109.169.200 (09/21 20:52)
推
09/21 21:03, , 1F
09/21 21:03, 1F
推
09/21 21:56, , 2F
09/21 21:56, 2F
推
09/21 22:03, , 3F
09/21 22:03, 3F
※ 編輯: seagal 來自: 140.109.169.200 (09/21 23:47)
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
Database 近期熱門文章
PTT數位生活區 即時熱門文章