存储过程中的out,output,return 的使用

output 类型的参数需要在存储过程的参数列表中添加。output类型的参数传入存储过程后还会返回其运行后的值。

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下调用存储过程:

  1. <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>   
  2.   
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  4.   
  5. <html xmlns="http://www.w3.org/1999/xhtml">   
  6. <head runat="server">   
  7.     <title>使用存储过程</title>   
  8.     <mce:style type="text/css"><!--  
  9.         #form1   
  10.         {   
  11.             margin-left: 206px;   
  12.         }   
  13.        
  14. --></mce:style><style type="text/css" mce_bogus="1">        #form1   
  15.         {   
  16.             margin-left: 206px;   
  17.         }   
  18.     </style>   
  19. </head>   
  20. <body>   
  21.     <form id="form1" runat="server" style="border-style: none; width: 339px;">   
  22.     <div>   
  23.        
  24.     </div>   
  25.     <asp:Label ID="Label3" runat="server" Text=" 输  入  参  数:"></asp:Label>   
  26.     <asp:TextBox ID="Input" runat="server" BorderStyle="NotSet"></asp:TextBox>   
  27.  <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/提交.GIF"    
  28.         οnclick="ImageButton1_Click" style="height: 20px" />   
  29.     <hr width="95%" />   
  30.     <br />   
  31.     <asp:Label ID="Label1" runat="server" Text="OUTPUT参数:"></asp:Label>   
  32.     <asp:Label ID="Output" runat="server" BorderColor="#6600FF" BorderStyle="None"    
  33.         BorderWidth="1px" Width="100px">暂无</asp:Label>   
  34.     <hr width="95%" />   
  35.     <br />   
  36.     <asp:Label ID="Label4" runat="server" Text="RETURN返回:"></asp:Label>   
  37.     <asp:Label ID="Return" runat="server" BorderColor="#6600FF" BorderWidth="1px"    
  38.         Width="100px" BorderStyle="None">暂无</asp:Label>   
  39.     </form>   
  40. </body>   
  41. </html>  

 

  1. protected void ImageButton1_Click(object sender, ImageClickEventArgs e)   
  2. {   
  3.     //定义数据库连接和SqlCommand对象   
  4.     SqlConnection Conn=new SqlConnection(ConfigurationManager.ConnectionStrings["TestConnection"].ToString());   
  5.     SqlCommand Cmd=new SqlCommand("Proc_Test;1",Conn);   
  6.     Cmd.CommandType = CommandType.StoredProcedure;   
  7.        
  8.     //指定参数类型   
  9.     SqlParameter input = Cmd.Parameters.Add("@INPUT", SqlDbType.Int);   
  10.     SqlParameter output = Cmd.Parameters.Add("@OUTPUT", SqlDbType.Int);   
  11.     SqlParameter return_ = Cmd.Parameters.Add("@RETURN", SqlDbType.Int);   
  12.        
  13.     //指定参数方向   
  14.     input.Direction = ParameterDirection.Input;   
  15.     output.Direction = ParameterDirection.Output;   
  16.     return_.Direction = ParameterDirection.ReturnValue;   
  17.   
  18.     //参数赋值   
  19.     if (Input.Text == "")   
  20.     {   
  21.         input.Value = 0;   
  22.     }   
  23.     else  
  24.     {   
  25.         input.Value = Convert.ToInt32(Input.Text);   
  26.     }   
  27.   
  28.     //调用存储过程   
  29.     Conn.Open();   
  30.     Cmd.ExecuteNonQuery();   
  31.     Conn.Close();   
  32.   
  33.        
  34.     Output.Text = output.Value.ToString();//获取output值   
  35.     Return.Text = return_.Value.ToString();//获取返回值   
  36.   
  37. }  
转载:http://www.cnblogs.com/lengbingshy/archive/2010/02/22/1671262.html


CREATE TABLE [dbo].[Order](
[o_id] [bigint] IDENTITY(1,1NOT FOR REPLICATION NOT NULL,
[o_buyerid] [int] NOT NULL
)

1.OUPUT参数返回值
例: 向Order表插入一条记录,返回其标识

CREATE PROCEDURE [dbo].[nb_order_insert](
@o_buyerid int ,
@o_id bigint OUTPUT
)
AS

BEGIN
SET NOCOUNT ON;
BEGIN

INSERT INTO [Order](o_buyerid )
VALUES (@o_buyerid )
SET @o_id = @@IDENTITY

END
END

存储过程中获得方法:

DECLARE   @o_buyerid  int
DECLARE   @o_id  bigint
EXEC   [ nb_order_insert ]   @o_buyerid  ,@o_id output;

2.RETURN过程返回值

CREATE PROCEDURE [dbo].[nb_order_insert](
@o_buyerid int ,
@o_id bigint OUTPUT
)
AS

BEGIN
SET NOCOUNT ON;
IF(EXISTS(SELECT * FROM [Shop] WHERE [s_id] = @o_shopid))
BEGIN

INSERT INTO [Order](o_buyerid )
VALUES (@o_buyerid )
SET @o_id = @@IDENTITY

RETURN 1 — 插入成功返回1
END

ELSE
RETURN 0 — 插入失败返回0
END

存储过程中的获取方法
DECLARE   @o_buyerid  int
DECLARE   @o_id  bigint
DECLARE   @result  bit
EXEC   @result   =   [ nb_order_insert ]   @o_buyerid  ,@o_id output  


 
 
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();
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值