一般的程式語言建議是進行防禦式程式設計,在開始處理之前先檢查所有引數的合法性。
但實際上,對資料庫程式設計而言,盡量同時做幾件事情的進攻式程式設計有切實的優勢。
*/--我們sp中常見的防禦式程式設計示例:
--場景一:判斷資料是否存在
注:c為乙個不可空欄位
ifnotexists
(
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
修改如下:
selecttop (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開始,然後累加,如果排序子句內容重複,流水號也跟著重複.而後...