return value类型的参数不需要在存储过程的参数列表中添加。return value类型的参数就是存储过程最后return的值。
数据库中使用output值和return值:
-------------------------------------------------------
--数获存储过程中的OUTPUT参数和返回值获取
-------------------------------------------------------
CREATE PROCEDURE Proc_Test;1
@INPUT int,
@OUTPUT int output
AS
BEGIN
SET NOCOUNT ON;
SELECT @OUTPUT=@INPUT
RETURN @INPUT+1
END
GO
--调用output值和return返回值
DECLARE @OUT int,@RETURN int
EXEC @RETURN=Proc_Test;1
0,
@OUT output
SELECT [返回值]=@RETURN,[OUTPUT值]=@OUT
返回值 OUTPUT值
----------- -----------
1 0
-----------------------------------------------------
-- SP_EXECUTESQL中的OUTPUT参数获取
-----------------------------------------------------
DECLARE @Para1 int,@Para2 int,@SUM int
EXECUTE SP_EXECUTESQL
N'SELECT @SUM=@Para1+@Para2 ',
N'@Para1 INT,@Para2 INT,@SUM INT OUTPUT ',
5,5,@SUM OUTPUT
SELECT [OUTPUT值]=@SUM
OUTPUT值
-----------
10
======================================================================
下面在.net下调用存储过程:
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <title>使用存储过程</title>
- <mce:style type="text/css"><!--
- #form1
- {
- margin-left: 206px;
- }
- --></mce:style><style type="text/css" mce_bogus="1"> #form1
- {
- margin-left: 206px;
- }
- </style>
- </head>
- <body>
- <form id="form1" runat="server" style="border-style: none; width: 339px;">
- <div>
- </div>
- <asp:Label ID="Label3" runat="server" Text=" 输 入 参 数:"></asp:Label>
- <asp:TextBox ID="Input" runat="server" BorderStyle="NotSet"></asp:TextBox>
- <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/提交.GIF"
- οnclick="ImageButton1_Click" style="height: 20px" />
- <hr width="95%" />
- <br />
- <asp:Label ID="Label1" runat="server" Text="OUTPUT参数:"></asp:Label>
- <asp:Label ID="Output" runat="server" BorderColor="#6600FF" BorderStyle="None"
- BorderWidth="1px" Width="100px">暂无</asp:Label>
- <hr width="95%" />
- <br />
- <asp:Label ID="Label4" runat="server" Text="RETURN返回:"></asp:Label>
- <asp:Label ID="Return" runat="server" BorderColor="#6600FF" BorderWidth="1px"
- Width="100px" BorderStyle="None">暂无</asp:Label>
- </form>
- </body>
- </html>
- protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
- {
- //定义数据库连接和SqlCommand对象
- SqlConnection Conn=new SqlConnection(ConfigurationManager.ConnectionStrings["TestConnection"].ToString());
- SqlCommand Cmd=new SqlCommand("Proc_Test;1",Conn);
- Cmd.CommandType = CommandType.StoredProcedure;
- //指定参数类型
- SqlParameter input = Cmd.Parameters.Add("@INPUT", SqlDbType.Int);
- SqlParameter output = Cmd.Parameters.Add("@OUTPUT", SqlDbType.Int);
- SqlParameter return_ = Cmd.Parameters.Add("@RETURN", SqlDbType.Int);
- //指定参数方向
- input.Direction = ParameterDirection.Input;
- output.Direction = ParameterDirection.Output;
- return_.Direction = ParameterDirection.ReturnValue;
- //参数赋值
- if (Input.Text == "")
- {
- input.Value = 0;
- }
- else
- {
- input.Value = Convert.ToInt32(Input.Text);
- }
- //调用存储过程
- Conn.Open();
- Cmd.ExecuteNonQuery();
- Conn.Close();
- Output.Text = output.Value.ToString();//获取output值
- Return.Text = return_.Value.ToString();//获取返回值
- }
CREATE TABLE [dbo].[Order](
[o_id] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[o_buyerid] [int] NOT NULL
)
1.OUPUT参数返回值
例: 向Order表插入一条记录,返回其标识













存储过程中获得方法:



2.RETURN过程返回值

















存储过程中的获取方法




create
proc Proc_OutPutTest
--创建
@numA
int
,
--numA为存储过程的参数
@numB
int
,
--numB为另一参数
@numReturn
int
output
--此为Output,也就是存储过程的返回值
as
begin
if(@numA>@numB)
set
@numReturn=@numA
else
set
@numReturn=@numB
--A>B的时候返回A,否则返回B
end
go
declare
@numReceive
int
--先声明一个变量用来接收存储过程的返回值
exec
Proc_OutPutTest 1,2, @numReceive
output
--调用存储过程并用@numReturn接收存储过程的返回值
select
@numReceive
--将会返回(1,2)中较大的数字:2
go
create
proc Proc_OutTest
--新建存储过程
@numC
int
,
--参数C
@numD
int
,
--参数D
@numE
int
out
--参数E用来返回
as
begin
if(@numC>@numD)
set
@numE=@numC
--如果C>D,将C赋值给E
else
set
@numE=@numD
--否则将D赋值给E
end
go
declare
@numOutReceive
int
--声明一个变量
set
@numOutReceive=10000
--将变量赋值为10000
select
@numOutReceive
--变量变为10000
exec
Proc_OutTest 1,2, @numOutReceive
out
--将(1,2,@numOutReceive)三个数字传入存储过程
select
@numOutReceive
--再看变量就变成2了
--总结:
--Out是参数,传进、传出,缺一不可,在存储过程定义的时候一定要有out标识,
--在调用该存储过程的时候也要有out标识
--OutPut则是相当于存储过程的返回值
--不用传进,也不能传进
--它是在存储过程中定义,并且输出的
-- 一句话:Out相当于C#中的ref参数(传进、传出缺一不可),而且传进传出的时候都要标识为ref
-- OutPut则为C#中的方法返回值类型,在方法定义时就已经定好了
创建存储过程
CREATE proc pro_TestProcTwo
(
@a int ,
@b int out,
@c int output
)
as
set @a = @a*2;
set @c = @a + 2;
set @b = @a + @c;
return @a+@b+@c;
执行存储过程
declare @b int,@c int,@return int
exec @return = pro_TestProcTwo 10,@b out,@c output;
select @b as 'out' ,@c as 'output', @return as 'return';
在c#中调用存储过程
string strRes = null;
int result = 0;
int _output = 0;
int _return = 0;
int _out = 0;
try
{
using (SqlConnection myConnection = new SqlConnection(SqlHelper.myConnection))
{
using (SqlCommand myCommand = new SqlCommand("pro_TestProcTwo", myConnection))
{
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@a", 10);
SqlParameter outputOne = myCommand.Parameters.Add("@b", SqlDbType.Int);
SqlParameter outPutTwo = myCommand.Parameters.Add("@c", SqlDbType.Int);
outputOne.Direction = ParameterDirection.Output;
outPutTwo.Direction = ParameterDirection.Output;
SqlParameter t_return = myCommand.Parameters.Add("@return", SqlDbType.Int);
t_return.Direction = ParameterDirection.ReturnValue;
myConnection.Open();
myCommand.ExecuteNonQuery();
result = myCommand.ExecuteNonQuery();
_out = Convert.ToInt32(outputOne.Value);
_output = Convert.ToInt32(outPutTwo.Value);
_return = Convert.ToInt32(t_return.Value);
}
}
}
catch (Exception ee)
{
strRes = ee.Message.ToString();
}