在SQL Server儲存過程中使用事務及返回值

2022-03-24 20:49:19 字數 2676 閱讀 5180

1

create

procedure

testtran23

as45declare

@userid

int6

7set

nocount on8

9begin

tran

adduser

1011

insert

into

testtable(username,password,email) 

values('

milo',

'831105',

'milo42102126.com')

1213

if@@error

<>0or

@@rowcount=0

goto

errmsg

1415

set@userid

=@@identity

1617

setnocount 

off18

19commit

tran

adduser

2021

return1--

新增成功

2223

24errmsg:

25set

nocount 

off26

rollback

tran

adduser

27return-1

--新增失敗並回滾

2829

30go

31set nocount on 優化儲存過程

客戶端的應用程式中是沒有用的,這些資訊是儲存過程中的每個語句的done_in_proc 資訊。

我們可以利用set nocount 來控制這些資訊,以達到提高程式效能的目的。

msdn中幫助如下:

set nocount

使返回的結果中不包含有關受 transact-sql 語句影響的行數的資訊。

語法set nocount

注釋當 set nocount 為 on 時,不返回計數(表示受 transact-sql 語句影響的行數)。當 set nocount 為 off 時,返回計數。

即使當 set nocount 為 on 時,也更新 @@rowcount 函式。

當 set nocount 為 on 時,將不給客戶端傳送儲存過程中的每個語句的 done_in_proc 資訊。當使用   microsoft sql server 提供的實用工具執行查詢時,在 transact-sql 語句(如 select、_insert、 _update 和 _delete)結束時將不會在查詢結果中顯示"nn rows affected"。

如果儲存過程中包含的一些語句並不返回許多實際的資料,則該設定由於大量減少了網路流量,因此可顯著提高效能。

在查詢分析器執行update或delete語句時,完成後會提示影響xx行記錄,

當 set nocount 為 on 時執行完相關的操作不返回這個提示資訊(根據實際情況有時候的確不需要此資訊),通過該設定減少了網路流量而提高效率。

on和off: 實際上就是一組開關,設定為on時,後面所有的相關sql都不再提示結果行數,設定為off時,就恢復原來狀態了。 12

usepubs   

3update

dbo.titles 

settitle_id 

=ltrim

(title_id  4--

執行完上面的sql顯示  (所影響的行數為 18 行)

5update

dbo.titles 

settitle 

=ltrim

(title)6--

(所影響的行數為 18 行)78

setnocount on9

update

dbo.titles 

settitle_id 

=ltrim

(title_id)

10--

命令已成功完成。(沒有行數提示了)

11後面再執行什麼sql都不會有行數提示了,除非 

setnocount 

off12

set nocount 設定是在執行或執行時設定,而不是在分析時設定。(是指在程式設計階段,沒辦法設定這個屬性,必須用語句執行設定)

許可權set nocount 許可權預設授予所有使用者。

結論:我們應該在儲存過程的頭部加上set nocount on 這樣的話,在退出儲存過程的時候加上 set nocount off(沒有必要寫,只是寫作習慣罷了,有些設定在儲存過程中開啟後需要是關閉,免的影響其他的語句)這樣的話,以達到優化儲存過程的目的。

多說兩句:

1:在檢視sqlserver的幫助的時候,要注意「許可權」這一節,因為某些語句是需要一定的許可權的,而我們往往忽略。

2:@@rowcount是返回受上一語句影響的行數,包括找到記錄的數目、刪除的行數、更新的記錄數等,不要認為只是返回查詢的記錄數目,而且@@rowcount要緊跟需要判斷語句,否則@@rowcount將返回0。

3:如果使用表變數,在條件表示式中要使用別名來替代表名,否則系統會報錯。

4:在cud類的操作中一定要有事務處理。

5:使用錯誤處理程式,用來檢查 @@error 系統函式的 t-sql 語句 (if) 實際上在程序中清除了 @@error 值,無法再捕獲除零之外的任何值,必須使用 set 或 select 立即捕獲錯誤**。

sqlserver中在儲存過程中寫事務

由於對資料的操作經常需要併發,所以在儲存過程中使用事務是非常必要的,我經常這樣處理 if exists select from sys.objects where name sp drop proc sp gocreate procedure sp 引數列表.out bit 0 output 輸出引...

SQLServer 儲存過程中各種判斷是否為空

1.判斷是否存在這樣的記錄 if not exists 和 if exists 相對應 例 使用者是否存在 if not exists if exists select 1 from user nolock where username abcd begin print 使用者存在 end else...

SqlServer儲存過程中迴圈的使用

1.while迴圈 格式示例如下 declare iint set i 1 while i 30begin insert into test userid values i set i i 1end2.游標迴圈 格式示例如下 declare a1varchar 10 a2varchar 10 a3i...