SQLSERVER學習筆記 進攻式程式設計

2022-02-08 23:05:37 字數 1676 閱讀 1555

一般的程式語言建議是進行防禦式程式設計,在開始處理之前先檢查所有引數的合法性。

但實際上,對資料庫程式設計而言,盡量同時做幾件事情的進攻式程式設計有切實的優勢。

*/--我們sp中常見的防禦式程式設計示例:

--場景一:判斷資料是否存在

注:c為乙個不可空欄位

if

notexists

(

select

top (1) 1

from a with

(nolock)

where id =

@id)

begin

set@response='

e'goto

errorhandle

endselect

top (1) @b=c

from a with

(nolock)

where id=

@id

修改如下:

select

top (1) @b=c

from dbo.a with

(nolock)

where id=

@idif

@bis

null

begin

set@response='

e'goto

errorhandle

end

這種情形下,c是非空欄位,那麼就可以直接去它來判斷這個item是否存在,這樣就減少一次a表的查詢

--

場景二:當資料存在時更新,不存在時插入

ifexists

(

select

top1

1from dbo.a with

(nolock)

where 欄位2=

1583

)begin

update

top(1

) dbo.a

set 欄位1=

'ccc

'where 欄位2=

2123

endelse

begin

insert

into

dbo.a

( 欄位1,

欄位2)

values

( aaa,

'ccc')

end/*

分析:這種使用select去判斷存在性是不建議的

我們可以直接通過where條件去update,當update所影響的行數等於0時,就說明該資料不存在,這時再insert

修改如下:

*/update

top(1

) dbo.a

set 欄位1=

'aaa

'where 欄位2 =

123if

@@rowcount=0

begin

insert

into

dbo.a

( 欄位1,

欄位2)

values

( aaa,

'ccc')

end/*

總結:以合理的可能性為基礎。

以概論為基礎進行程式設計。

假設最可能的結果。

不是的確必要,不要採用異常捕捉的處理方式。

*/

sqlserver學習筆記

1.從乙個已經存在的表複製出乙個新錶 要求該錶不存在 select into time pense from time pensetemp 從time pensetemp表中複製time pense表 2.sql查詢表中的所有約束 exec sp helpconstraint objname 表名 ...

sqlserver學習筆記

排序函式 產生乙個新的列,一般作為乙個流水號 排序函式 over 分組子句 排序子句 desc asc 1 row number 產生乙個新的列流水號列,所有的流水號從1開始,然後累加 2 rank 產生乙個新的列流水號列,所有的流水號從1開始,然後累加,如果排序子句內容重複,流水號也跟著重複.而後...

sqlserver學習筆記

排序函式 產生乙個新的列,一般作為乙個流水號 排序函式 over 分組子句 排序子句 desc asc 1 row number 產生乙個新的列流水號列,所有的流水號從1開始,然後累加 2 rank 產生乙個新的列流水號列,所有的流水號從1開始,然後累加,如果排序子句內容重複,流水號也跟著重複.而後...