含多項查詢條件的儲存過程(SQL2008)

2021-08-25 13:36:01 字數 4218 閱讀 7879

在做乙個搜尋時,有多項搜尋條件,如果這麼多條件單獨在程式裡判斷是很麻煩的。今天花幾個小時的時間才做好這個儲存過程,用這麼長別笑話我笨啊,呵呵,發現很多基礎的語法都忘了,當然用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...