sqlserver存儲過程返回表
SQL Server中存儲過程的返回值不是通過return語句返回的(return語句是在用戶自定義函數中使用的),而是通過存儲過程的參數來返回,在定義存儲過程的參數時使用關鍵字output來指定此參數是返回值。
而在調用存儲過程時,也必須使用關鍵字給接收返回值的變數,這樣才能在調用時獲得存儲過程的返回值。
示例:
create procere dbo.pr_add @a int, @b int, @c int outputas set @c = @a + @bgo
調用:
declare @v intexecute dbo.pr_add 1, 2, @v outputselect @v
② SQL SERVER裡面如何在存儲過程裡面獲取另一個存儲過程所返回的表的數據
首先需要知道「另一個存儲過程」的結果集的所有列的類型。
假設「另一個存儲過程」的名字是sp1,沒有參數,返回的結果集共3列,全部為int型,那麼「存儲過程」里添加一個與結果集列數相同的臨時表或表變數用於接收「另一個存儲過程」的結果集
如下
CREATE PROCEDURE sp2
AS
DECLARE @t table(a int,b int,c int)
INSERT INTO @t(a,b,c)
EXEC sp1
SELECT * FROM @t
使用SQLSERVER存儲過程可以很大的提高程序運行速度,簡化編程維護難度,現已得到廣泛應用。
創建存儲過程
和數據表一樣,在使用之前需要創建存儲過程,它的簡明語法是:
引用:
Create PROC 存儲過程名稱
[參數列表(多個以「,」分隔)]
AS
SQL 語句
例:
引用:
Create PROC upGetUserName
@intUserId INT,
@ostrUserName NVARCHAR(20) OUTPUT -- 要輸出的參數
AS
BEGIN
-- 將uName的值賦給 @ostrUserName 變數,即要輸出的參數
Select @ostrUserName=uName FROM uUser Where uId=@intUserId
END
其中 Create PROC 語句(完整語句為Create PROCEDURE)的意思就是告訴SQL SERVER,現在需要建立一個存儲過程,upGetUserName 就是存儲過程名稱,@intUserId 和 @ostrUserName 分別是該存儲過程的兩個參數,注意,在SQL SERVER中,所有用戶定義的變數都以「@」開頭,OUTPUT關鍵字表示這個參數是用來輸出的,AS之後就是存儲過程內容了。只要將以上代碼在「查詢分析器」里執行一次,SQL SERVER就會在當前資料庫中創建一個名為「upGetUserName」的存儲過程。你可以打開「企業管理器」,選擇當前操作的資料庫,然後在左邊的樹型列表中選擇「存儲過程」,此時就可以在右邊的列表中看到你剛剛創建的存儲過程了(如果沒有,刷新一下即可)。
二、存儲過程的調用
之前已經創建了一個名為「upGetUserName」的存儲過程,從字面理解該存儲過程的功能是用來取得某一個用戶的名稱。存儲過程建立好了,接下來就是要在應用程序里調用了,下面看一下在ASP程序里的調用。
引用:
Dim adoComm
』// 創建一個對象,我們用來調用存儲過程
Set adoComm = CreateObject("ADODB.Command")
With adoComm
』// 設置連接,設 adoConn 為已經連接的 ADODB.Connection 對象
.ActiveConnection = adoConn
』// 類型為存儲過程,adCmdStoredProc = 4
.CommandType = 4
』// 存儲過程名稱
.CommandText = "upGetUserName"
』// 設置用戶編號
.Parameters.Item("@intUserId").Value = 1
』// 執行存儲過程
.Execute
』// 取得從存儲過程返回的用戶名稱
Response.Write "用戶名:" & .Parameters.Item("@ostrUserName").Value
End With
』// 釋放對象
Set adoComm = Nothing
通過以上兩步,已經可以創建和使用簡單的存儲過程了。下面來看一個稍微復雜點的存儲過程,以進一步了解存儲過程的應用。
三、存儲過程的實際應用
用戶登錄在ASP項目中經常會使用到,但使用存儲過程來做驗證可能不多,那麼做例子,寫一個簡單的用戶登錄驗證的存儲過程。
引用:
Create PROC upUserLogin
@strLoginName NVARCHAR(20),
@strLoginPwd NVARCHAR(20),
@blnReturn BIT OUTPUT
AS
-- 定義一個臨時用來保存密碼的變數
DECLARE @strPwd NVARCHAR(20)
BEGIN
-- 從表中查詢當前用戶的密碼,賦值給 @strPwd 變數,下面要對他進行比較
Select @strPwd=uLoginPwd FROM uUser Where uLoginName=@strLoginName
IF @strLoginPwd = @strPwd
BEGIN
SET @blnReturn = 1
-- 更新用戶最後登錄時間
Update uUser SET uLastLogin=GETDATE() Where uLoginName=@strLoginName
END
ELSE
SET @blnReturn = 0
END
用戶登錄的存儲過程建立好了。注意,在一個區域內如果有多條語句時,必需使用BEGIN...END關鍵字。
引用:
Dim adoComm
』// 創建一個對象,我們用來調用存儲過程
Set adoComm = CreateObject("ADODB.Command")
With adoComm
』// 設置連接,設 adoConn 為已經連接的 ADODB.Connection 對象
.ActiveConnection = adoConn
』// 類型為存儲過程,adCmdStoredProc = 4
.CommandType = 4
』// 存儲過程名稱
.CommandText = "upUserLogin"
』// 設置登錄名稱
.Parameters.Item("@strLoginName").Value = "***"
』// 設置登錄密碼
.Parameters.Item("@strLoginPwd").Value = "123456"
』// 執行存儲過程
.Execute
』// 判斷是否登錄成功
If .Parameters.Item("@blnReturn").Value = 1 Then
Response.Write "恭喜你,登錄成功!"
Else
Response.Write "不是吧,好像錯了哦。。。"
End If
End With
』// 釋放對象
Set adoComm = Nothing
通過以上的步驟,簡單用戶登錄驗證過程也做完了,現在只要把它整合到程序中就可以實現簡單的用戶登錄驗證了,關於其他細節就由你自己來處理了。
上面介紹的兩個存儲過程都是只返回一個值的,下面我們來看一個返回一個記錄集的存儲過程。
引用:
Create PROC upGetUserInfos
@intUserGroup INT
AS
BEGIN
-- 從資料庫中抽取符合條件的數據
Select uName,uGroup,uLastLogin FROM uUser Where uGroup=@intUserGroup
-- 插入一列合計
UNION
Select 』合計人數:』,COUNT(uGroup),NULL FROM uUser Where uGroup=@intUserGroup
END
現在我們來看一下ASP程序的調用。
引用:
Dim adoComm
Dim adoRt
』// 創建一個對象,我們用來調用存儲過程
Set adoComm = CreateObject("ADODB.Command")
Set adoRs = CreateObject("ADODB.Recordset")
With adoComm
』// 設置連接,設 adoConn 為已經連接的 ADODB.Connection 對象
.ActiveConnection = adoConn
』// 類型為存儲過程,adCmdStoredProc = 4
.CommandType = 4
』// 存儲過程名稱
.CommandText = "upGetUserInfos"
』// 設置用戶組
.Parameters.Item("@intUserGroup").Value = 1
』// 執行存儲過程,和以上幾個例子不同,這里使用RecordSet的Open方法
adoRs.Open adoComm
』// 顯示第一個值
Response.write adoRs.Fields(0).Value
End With
』// 釋放對象
Set adoRs = Nothing
Set adoComm = Nothing
③ 關於sql sever 的系統存儲過程
存儲過程分為三類:
系統存儲過程:(System stored Procere)sp_開頭,為SQLSERVER內置存儲過程。
擴展存儲過程:(Extended stored Procere),也就是外掛程序,用於擴展SQLSERVER的功能,以sp_或者xp_開頭,以DLL的形式單獨存在。
(系統存儲過程和擴展存儲過程都是在master資料庫中。sp_開頭的可是全局的,任何一個資料庫都可以直接調用的。)
系統存儲過程主要分為以下幾類:
目錄存儲過程,例如:
sp_columns 返回當前環境中可查詢的指定表或視圖的列信息。
sp_tables 返回當前環境下可查詢的對象的列表(任何可出現在 FROM 子句中的對象)。
sp_stored_proceres 返回當前環境中的存儲過程列表。
復制類存儲過程,例如:
sp_addarticle 創建項目並將其添加到發布中。此存儲過程在發布伺服器的發布資料庫上執行。
安全管理類存儲過程,例如:
sp_addrole 在當前資料庫創建新的 Microsoft�0�3 SQL Server�6�4 角色。
sp_password 添加或更改 Microsoft�0�3 SQL Server�6�4 登錄的密碼。
分布式查詢存儲過程,例如:
sp_foreignkeys 返回引用主鍵的外鍵,這些主鍵在鏈接伺服器中的表上。
sp_primarykeys 返回指定遠程表的主鍵列,每個鍵列佔一行。
擴展存儲過程:
xp_sendmail 向指定的收件人發送郵件和查詢結果集附件。
xp_startmail 啟動 SQL 郵件客戶端會話。
xp_cmdshell 以操作系統命令行解釋器的方式執行給定的命令字元串,並以文本行方式返回任何輸出。授予非管理用戶執行xp_cmdshell 的許可權。
用戶定義的存儲過程:(User-defined stored Procere),這個就是用戶在具體的資料庫中自己定義的,名字最好不要以sp_和xp_開頭,防止混亂。
注意事項:
1.在存儲過程中,有些建立對象的語句是不可使用的:create default,create trigger,create procere,create view,create rule.
2.在同一資料庫中,不同的所有者可以建立相同名稱的對象名。例如:a.sample,b.sample,c.sample三個數據表可以同時存在。如果存儲過程中未指明對象的所有者(例如存儲過程中的語句select * from sample,這句中的sample沒有指明所有者),在執行的過程中默認的所有者查找順序是:相應的存儲過程的建立者->相應資料庫的所有者。如果這個查找過程中沒有把所有者確定下來,系統就要報錯。
(這里我額外插一句:如果需要嚴密的數據操作,在任何操作中盡量加上所有者,例如leijun.sample)
3.在存儲過程名稱前邊添加#或者##,所建立的存儲過程則是「臨時存儲過程「(#是局部臨時存儲過程,##是全局臨時存儲過程)。
④ SQL SERVER裡面如何在存儲過程裡面獲取另一個存儲過程所返回的表的數據
第一個存儲過程(被調用的)里定義OUTPUT參數,如:
...
Create Procere 存儲過程1
@參數1 數據類型
@參數2 數據類型 output
AS
存儲過程語句
第二個存儲過程:
...
Create ...
...
AS
Declare @本地參數1
Declare @本地參數2
EXEC 存儲過程1 @本地參數1,@本地參數2 OUTPUT
--這樣@本地參數2就可以直接使用了,帶回來的是存儲過程1中的@參數2.
⑤ 怎樣讓SqlServer的存儲過程返回結果集
1、返回結果集
這是客戶端應用程序返回結果的最通用的方法。結果集是通過使用SELECT語句選擇數據產生的。結果集可以從永久表、臨時表或局部變數中產生。將結果返回到另一個存儲過程不是一種有效的方法。存儲過程不能訪問另一個存儲過程建立的結果集。
例如從永久表中返回結果集:
USE pubs
GO
CREATE PROCEDURE ap_CreateResultFromPermtable
AS
SELECT au_iname FROM authors
例如從局部變數中創建結果集:
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
⑥ sqlserver
摘自:http://database.ctocio.com.cn/analysis/465/7709465.shtml
【IT專家網獨家】SQL Server用戶自定義函數和存儲過程有類似的功能,都可以創建捆綁SQL語句,存儲在server中供以後使用。這樣能夠極大地提高工作效率,通過以下的各種做法可以減少編程所需的時間:
重復使用編程代碼,減少編程開發時間。
隱藏SQL細節,把SQL繁瑣的工作留給資料庫開發人員,而程序開發員則集中處理高級編程語言。
維修集中化,可以在一個地方做業務上的邏輯修改,然後讓這些修改自動應用到所有相關程序中。
乍看之下,用戶自定義函數和存儲過程的功能似乎一摸一樣。但是,其實這兩者之間還有一些雖然細微但是很重要的差異:
存儲過程是使用EXEC命令獨立調用的,而用戶自定義函數是在另一個SQL語句中調用的。
l存儲程序是允許用戶和程序去使用存儲過程,而不是允許其存取表格,這樣能夠增強程序安全性。與標準的SQL Server相比,存儲程序限制用戶行動許可權方面更為細化。例如,如果你有一個貨存表格,每次賣出一個貨物收銀員都要對表格進行更新一次(從貨存中把該貨品減去一件)。你可以給收銀員設置許可權,允許其使用decrement_item存儲過程,而不是允許他們有任意修改或村表格的許可權。
函數必須始終返回一個值(一個標量值或一個表格)。而存儲過程可以返回一個標量值、一個表值或無需返回值。
總而言之,存儲程序對SQL Server開發員來說是最有價值的寶物之一,用於資料庫中,能夠大大的提高工作效率,增強安全性,絕對超值。
⑦ oracle中在存儲過程中怎麼返回值
第一個問題
:
oracle沒有inser
into
表
存儲過程
的語句格式,所以這個需要你根據實際要求換種思路做吧。
第二個問題:
sqlserver
:'a'+char(10)+'b'
oracle:'a'
||
chr(10)
||
'b'
sqlserver中的
char函數
在oracle中是chr,參數和
返回值
是一樣的。
⑧ C#獲取 sqlserver 存儲過程返回多表數據
返回的時候用dataset就可以,比如你存儲過程這樣寫
select * from A
select * from B
select * from C
select * from D
select * from D
在執行完存儲過程後返回一個dataset
dataset ds = 執行存儲過程
ds.tables[0]就是表A
ds.tables[1]就是表B
ds.tables[2]就是表C
剩下的依次類推.