存储过程中返回结果集
生活随笔
收集整理的這篇文章主要介紹了
存储过程中返回结果集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
存儲過程中返回結果
從存儲過程中返回結果有三種方式:
1、 返回結果集
這是客戶端應用程序返回結果的最通用的方法。結果集是通過使用select語句選擇數據產生的。結果集可以從永久表、臨時表或局部變量中產生。將結果返回到另一個存儲過程不是一種有效的方法。存儲過程不能訪問另一個存儲過程建立的結果集。
例如從永久表中返回結果集:
use pubs
go
create procedure ap_createresultfrompermtable
as
select au_iname from authors
go
例如從局部變量中創建結果集:
use pubs
go
create procedure ap_createresultfromvariable
as
declare @au_iname char(20)
select @au_iname = au_iname from authors
where au_id = '172-32-1176’
select @au_id
go
2、 設置output參數的值
輸出參數經常用來從存儲過程中檢索出結果。如果某個參數在傳輸到存儲過程中時被定義成output,則對該參數的任何修改在退出存儲之后仍然有效。
例如:
use pubs
go
create procedure ap_setoutputvar @count integer output
as
select @count = count(*) from authors
go
從輸出參數中檢索出值:
use pubs
go
create procedure ap_getoutputvar
as
declare @num integer
execute ap_setoutputvar @num output
print “the count is”+convert(char,@num)
go
· 將游標使用成output參數。游標可以使用output(輸出)參數,但不能使用成輸入參數。也就是說,游標可以作為結果返回,但卻不能傳輸到過程中去。當游標被用作參數時,需要限定其為output和varying。varying關鍵字指出該結果集要用來支持輸出參數。這樣就提供了將結果集返回到調用過程的能力。
例如:
use pubs
go
create procedure gettitlecount @count_cursor cursor varying output
as
set @count_cursor = cursor
for
select au_id,count(*)
from titleauthors
group by au_id
open @count_cursor
go
3、 通過return參數返回狀態
這是一種從存儲過程返回錯誤碼的方法。存儲過程總是返回一個狀態值,用戶也可以使用return語句返回自己的狀態。
例如:
use pubs
go
create procedure ap_setreturnstatus
as
declare @count integer
select @count = count(*) from authors
if @count = 0
return(1)
else
return (0)
go
例如檢索出返回的狀態:
use pubs
go
create procedure ap_getreturnstatus
as
declare @status integer
execute @status = ap_setreturnstatus
if @status = 1
print “no rows found”
else
print “successful”
go
在存儲過程中進行錯誤處理
如同其它程序一樣,在存儲過程中進行錯誤處理是非常重要的。系統變更@@error在執行每一個transact sql語句之后都會得到一個值。對于成功的執行,@@error的值為0,如果出現錯誤,則@@error中將包含錯誤信息。@@error系統變量對存儲過程的錯誤處理是非常重要的。
注意:為了防止錯誤,@@error所能設置的值在sysmessages表的“error”中反映了出來。
在存儲過程中的錯誤有兩種類型:
1、 數據庫相關的錯誤
這些錯誤是由數據庫的不一致性引起的,系統使用非0的@@error值表示特定的數據庫問題。在transact sql執行之后,可以通過@@error獲得所出現的錯誤。如果發現@@error不為0,則必須采取必要的行動,大多數情況下,存儲將不再繼續進行處理而返回。下面的示例展示了典型的獲取數據庫錯誤的方法。該過程將錯誤代碼放置到輸出變量中,這樣,調用程序就能夠訪問到。
use pubs
go
create procedure ap_trapdatabaseerror @return_code integer output
as
update authors set au_iname = “jackson”
where au_iname = “smith”
if @@error <> 0
begin
select @return_code = @@error
return
end
else
@return_code = 0
go
2、 業務邏輯錯誤
這些錯誤是由于違反了業務規則而引起的。要獲取這些錯誤,首先需要定義業務規則,基于這些規則,需要在存儲過程中增加必要的錯誤檢測代碼。人們經常使用raiserror語句通報這些錯誤。raiserror提供了返回用戶定義錯誤及將@@error變量設置成用戶定義錯誤號的能力。錯誤消息可以被動態地建立,或者基于錯誤號從“sysmessages”表中檢索到。一旦出現了錯誤,錯誤就會以一種服務器錯誤消息的方式返回到客戶機。下面是raiserror命令的語法:
raiserror (msg_id | msg_str, severity, state
[, argument ][,…n]])
[with options]
msg_id指明用戶定義消息的id,該消息存儲在“sysmessages”系統表中。
msg_str用于動態創建消息的消息字符串。這與c語言中的“printf”非常相似。
severity定義用戶賦值的錯誤消息嚴重程度。
state是從1到127的任意整數值,它表示錯誤的調用狀態信息。負數的state值將缺省為1。
options指明錯誤的定制選項。options的有效值如下:
1) log。
將錯誤記錄到服務器錯誤日志和nt事件日志中。該選項需要消息帶有從19到25的嚴重程度。而只有系統管理員才能發出這種消息。
2) nowait。
將消息立即發送到客戶端服務器。
3) seterror。
不管其嚴重級別如何,將@@error的值設置為msg_id或5000。
遠程過程調用
sql server提供了調用駐留在不同服務器上的存儲過程的能力。調用這樣的存儲過程稱謂遠程存儲過程調用。為了使得調用能從一個sql server轉移到另一個服務器,兩個服務器應該相互定義成對方的有效遠程服務器。
設置遠程服務器的配置:
· 擴展某個服務器的組。
· 右擊該服務器并點擊“properties”。
· 設置選項“allow other sql servers to connect remotely to this sql server via rpc”。
· 設置“query time out”選項的值,該值指定從一個查詢處理返回所能等待的秒數。缺省值為0,表示允許無限的等待時間。
· 設置完成配置選項之后,點擊“ok”。
· 重新啟動服務器之后,修改將會生效。
· 在另一臺遠程服務器上重復相同的步驟。
調用遠程存儲過程需要指明服務器的名稱,后帶數據庫的名稱和擁有者的名稱。下面是在不同的服務器(server2)上調用一個存儲過程的示例。
exec server2.pubs.dbo.myproc
豆豆的后話:
這里只是粗淺的介紹了sql server常用的知識,對象也是基于sql server數據庫編寫應用程序的編程人員,而非數據庫管理者。但對于應用程序編程者,了解數據庫的管理也是非常有用的。建議在以后的時間自行去了解數據庫的管理,這對于優化程序也是相當有用的。 from:http://java.qingsoft.net/?action-viewthread-tid-519
從存儲過程中返回結果有三種方式:
1、 返回結果集
這是客戶端應用程序返回結果的最通用的方法。結果集是通過使用select語句選擇數據產生的。結果集可以從永久表、臨時表或局部變量中產生。將結果返回到另一個存儲過程不是一種有效的方法。存儲過程不能訪問另一個存儲過程建立的結果集。
例如從永久表中返回結果集:
use pubs
go
create procedure ap_createresultfrompermtable
as
select au_iname from authors
go
例如從局部變量中創建結果集:
use pubs
go
create procedure ap_createresultfromvariable
as
declare @au_iname char(20)
select @au_iname = au_iname from authors
where au_id = '172-32-1176’
select @au_id
go
2、 設置output參數的值
輸出參數經常用來從存儲過程中檢索出結果。如果某個參數在傳輸到存儲過程中時被定義成output,則對該參數的任何修改在退出存儲之后仍然有效。
例如:
use pubs
go
create procedure ap_setoutputvar @count integer output
as
select @count = count(*) from authors
go
從輸出參數中檢索出值:
use pubs
go
create procedure ap_getoutputvar
as
declare @num integer
execute ap_setoutputvar @num output
print “the count is”+convert(char,@num)
go
· 將游標使用成output參數。游標可以使用output(輸出)參數,但不能使用成輸入參數。也就是說,游標可以作為結果返回,但卻不能傳輸到過程中去。當游標被用作參數時,需要限定其為output和varying。varying關鍵字指出該結果集要用來支持輸出參數。這樣就提供了將結果集返回到調用過程的能力。
例如:
use pubs
go
create procedure gettitlecount @count_cursor cursor varying output
as
set @count_cursor = cursor
for
select au_id,count(*)
from titleauthors
group by au_id
open @count_cursor
go
3、 通過return參數返回狀態
這是一種從存儲過程返回錯誤碼的方法。存儲過程總是返回一個狀態值,用戶也可以使用return語句返回自己的狀態。
例如:
use pubs
go
create procedure ap_setreturnstatus
as
declare @count integer
select @count = count(*) from authors
if @count = 0
return(1)
else
return (0)
go
例如檢索出返回的狀態:
use pubs
go
create procedure ap_getreturnstatus
as
declare @status integer
execute @status = ap_setreturnstatus
if @status = 1
print “no rows found”
else
print “successful”
go
在存儲過程中進行錯誤處理
如同其它程序一樣,在存儲過程中進行錯誤處理是非常重要的。系統變更@@error在執行每一個transact sql語句之后都會得到一個值。對于成功的執行,@@error的值為0,如果出現錯誤,則@@error中將包含錯誤信息。@@error系統變量對存儲過程的錯誤處理是非常重要的。
注意:為了防止錯誤,@@error所能設置的值在sysmessages表的“error”中反映了出來。
在存儲過程中的錯誤有兩種類型:
1、 數據庫相關的錯誤
這些錯誤是由數據庫的不一致性引起的,系統使用非0的@@error值表示特定的數據庫問題。在transact sql執行之后,可以通過@@error獲得所出現的錯誤。如果發現@@error不為0,則必須采取必要的行動,大多數情況下,存儲將不再繼續進行處理而返回。下面的示例展示了典型的獲取數據庫錯誤的方法。該過程將錯誤代碼放置到輸出變量中,這樣,調用程序就能夠訪問到。
use pubs
go
create procedure ap_trapdatabaseerror @return_code integer output
as
update authors set au_iname = “jackson”
where au_iname = “smith”
if @@error <> 0
begin
select @return_code = @@error
return
end
else
@return_code = 0
go
2、 業務邏輯錯誤
這些錯誤是由于違反了業務規則而引起的。要獲取這些錯誤,首先需要定義業務規則,基于這些規則,需要在存儲過程中增加必要的錯誤檢測代碼。人們經常使用raiserror語句通報這些錯誤。raiserror提供了返回用戶定義錯誤及將@@error變量設置成用戶定義錯誤號的能力。錯誤消息可以被動態地建立,或者基于錯誤號從“sysmessages”表中檢索到。一旦出現了錯誤,錯誤就會以一種服務器錯誤消息的方式返回到客戶機。下面是raiserror命令的語法:
raiserror (msg_id | msg_str, severity, state
[, argument ][,…n]])
[with options]
msg_id指明用戶定義消息的id,該消息存儲在“sysmessages”系統表中。
msg_str用于動態創建消息的消息字符串。這與c語言中的“printf”非常相似。
severity定義用戶賦值的錯誤消息嚴重程度。
state是從1到127的任意整數值,它表示錯誤的調用狀態信息。負數的state值將缺省為1。
options指明錯誤的定制選項。options的有效值如下:
1) log。
將錯誤記錄到服務器錯誤日志和nt事件日志中。該選項需要消息帶有從19到25的嚴重程度。而只有系統管理員才能發出這種消息。
2) nowait。
將消息立即發送到客戶端服務器。
3) seterror。
不管其嚴重級別如何,將@@error的值設置為msg_id或5000。
遠程過程調用
sql server提供了調用駐留在不同服務器上的存儲過程的能力。調用這樣的存儲過程稱謂遠程存儲過程調用。為了使得調用能從一個sql server轉移到另一個服務器,兩個服務器應該相互定義成對方的有效遠程服務器。
設置遠程服務器的配置:
· 擴展某個服務器的組。
· 右擊該服務器并點擊“properties”。
· 設置選項“allow other sql servers to connect remotely to this sql server via rpc”。
· 設置“query time out”選項的值,該值指定從一個查詢處理返回所能等待的秒數。缺省值為0,表示允許無限的等待時間。
· 設置完成配置選項之后,點擊“ok”。
· 重新啟動服務器之后,修改將會生效。
· 在另一臺遠程服務器上重復相同的步驟。
調用遠程存儲過程需要指明服務器的名稱,后帶數據庫的名稱和擁有者的名稱。下面是在不同的服務器(server2)上調用一個存儲過程的示例。
exec server2.pubs.dbo.myproc
豆豆的后話:
這里只是粗淺的介紹了sql server常用的知識,對象也是基于sql server數據庫編寫應用程序的編程人員,而非數據庫管理者。但對于應用程序編程者,了解數據庫的管理也是非常有用的。建議在以后的時間自行去了解數據庫的管理,這對于優化程序也是相當有用的。 from:http://java.qingsoft.net/?action-viewthread-tid-519
轉載于:https://www.cnblogs.com/no7dw/archive/2010/06/19/1760668.html
總結
以上是生活随笔為你收集整理的存储过程中返回结果集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正骨多少钱啊?
- 下一篇: 求一个关于骷髅的个性签名。