在做乙個搜尋時,有多項搜尋條件,如果這麼多條件單獨在程式裡判斷是很麻煩的。今天花幾個小時的時間才做好這個儲存過程,用這麼長別笑話我笨啊,呵呵,發現很多基礎的語法都忘了,當然用sql2008也發現了些新問題。
原理:把條件進行字串拼接,就是判斷傳入的各個條件,如果傳入符合條件的值了,則在拼接此條件語句,否則不拼接此條件。也就是我在頁面上存在多條件查詢時,如果乙個文字框裡不輸入值了,則傳入空字串,儲存過程判斷如果是空字串就不拼接此條件,此時在寫**時,省了很多判斷。
詳細**如下所示,這裡對**需要注意的地方說下,也是我在做時出問題的地方:
1、如果資料庫是數字型別,需要利用convert
(varchar
(8000),
)轉換為字串,如下**中的:@strwhere
=@strwhere++
convert
(varchar
(8000),)
2、在資料庫4個單撇號才翻譯成乙個單撇號,在進行字串相等匹配時要注意前後有個單撇號,如下**中的:@strwhere
=@strwhere
+' and userip='
+''''
+@userip
+'''' 當然也可以這麼寫@strwhere
=@strwhere
+' and userip=
'''+
@userip
+'''' 原因是在字串常量中要輸出乙個單撇號,需要寫2個單撇號,如要輸出i'm a student 需要寫成select 'i''m a student'
3、字串模糊匹配別忘'%搜尋內容%
'前後的單撇號 如下**中的:@strwhere
=@strwhere
+' and username like '
+''''
+'%'
+@username
+'%'
+'''' 為了閱讀方便我把常量字串%單獨拿出來,對於常量字串前後有單撇號括起來
4、對於ntext型別進行字串拼接時,必須轉換為varchar否則出現「ntext 和varchar 在equal to 運算子中不相容」的錯誤提示,如下**中的:@strwhere
=@strwhere
+' and pageurl like '''
+'%'+''
+convert
(varchar
(8000),
@pageurl
)+''
+'%'''
5、對於日期字段本來我想傳入的是日期型別,所以直接進行比較,但結果沒成功。原因是此處為進行字串拼接,所以首先需要把傳入的日期引數轉化為字串(如下面的:convert
(varchar
(100),
@startlogtime
,23)
),然後再把此字串轉化為日期,當然這裡的轉化函式需要寫到字串常量裡。如下面的:@strwhere
=@strwhere
+' and logtime>=cast('
+''''
+convert
(varchar
(100),
@startlogtime
,23)+
''''
+' as datetime) ' 比如傳入的日期為2010-12-01,則最後形成的sql語句是:and logtime>=cast('2010-12-01' as datetime)
use[srlogdb]go
setansi_nullson
go
setquoted_identifier
ongo
------------------------------------
--用途:查詢記錄資訊
------------------------------------
create
procedure
[dbo]
.[proc_operation_log_getlist]
int,
@username
nvarchar
(50),
@userip
nvarchar
(15),
@pageurl
ntext
,@type
nvarchar
(100),
@startlogtime
datetime
,@endlogtime
datetime
asdeclare
@strwhere
varchar
(8000)
declare
@mindate
datetime
declare
@maxdate
datetime
set@strwhere=''
set@mindate
=cast
('1753-01-01'
asdatetime
)set
@maxdate
=cast
('9999-12-31'
asdatetime)
--數字型別匹配
if>0
begin
set@strwhere
=@strwhere++
convert
(varchar
(8000),
)end
--字元型別模糊查詢
if@username
<>
''begin
set@strwhere
=@strwhere
+' and username like '
+''''
+'%'
+@username
+'%'
+''''
end
--字元型別完全匹配
if@userip
<>
''begin
set@strwhere
=@strwhere
+' and userip='
+''''
+@userip
+''''
end
--@pageur
為ntext型別,必須型別轉換否則出現lntext 和varchar 在equal to 運算子中不相容的問題
ifconvert
(varchar
(8000),
@pageurl
)<>
''begin
set@strwhere
=@strwhere
+' and pageurl like '''
+'%'+''
+convert
(varchar
(8000),
@pageurl
)+''
+'%'''
end
--日期比較
if@startlogtime
>
@mindate
begin
set@strwhere
=@strwhere
+' and logtime>=cast('
+''''
+convert
(varchar
(100),
@startlogtime
,23)+
''''
+' as datetime) '
end
if@startlogtime
<
@maxdate
begin
set@strwhere
=@strwhere
+' and logtime<=cast('
+''''
+convert
(varchar
(100),
@endlogtime
,23)
+''''
+' as datetime) '
enddeclare
@strmain
varchar
(8000)
set@strmain
=from [operation_log]
where 1=1'
+@strwhere
exec
(@strmain)go
含多項查詢條件的儲存過程(SQL2008)
在做乙個搜尋時,有多項搜尋條件,如果這麼多條件單獨在程式裡判斷是很麻煩的。今天花幾個小時的時間才做好這個儲存過程,用這麼長別笑話我笨啊,呵呵,發現很多基礎的語法都忘了,當然用sql2008也發現了些新問題。原理 把條件進行字串拼接,就是判斷傳入的各個條件,如果傳入符合條件的值了,則在拼接此條件語句,...
儲存過程條件查詢
前幾天寫查詢,簡單的sql又滿足不了,只能寫在儲存過程裡面,先把資料放在臨時表裡面,然後在給臨時表拼接條件進行查詢,最後執行,注意這裡執行的內容是最關鍵的。如下 set ls select from tmps where 1 1 這是現將臨時表賦給引數,拼接上1 1 方便下面 繼續拼接and條件 i...
儲存過程裡多條件判斷 SQL組合查詢
我儲存過程裡想實現多個傳入引數的判斷,裡面有7個傳入引數條件.create procedure sp tbwastesource search sd datetime,開始日期 ed datetime,結束日期 con1 varchar 50 con2 varchar 30 con3 varchar...