一、存储过程return与output区别
<1> 共同点:都能返回值(但return只能返回int类型,output能自定义类型,然后需定义成存储过程的变量,如 @out varchar output)
<2> 不同点:
1.output是定义变量
2.output没有return从查询或过程中无条件退出的工功
3.return返回值在函数和过程定义时不需要用output来定义
二、怎样在asp.net 中获取一个查询功能的存储过程的查询记录呢?
(1)执行一个没有参数的存储过程的代码如下:
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.selectCommand = new SqlCommand();
da.selectCommand.Connection = conn;
da.selectCommand.CommandText = "NameOfProcedure";
da.selectCommand.CommandType = CommandType.StoredProcedure;
(2)执行一个有参数的存储过程的代码如下:
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.selectCommand = new SqlCommand();
da.selectCommand.Connection = conn;
da.selectCommand.CommandText = "NameOfProcedure";
da.selectCommand.CommandType = CommandType.StoredProcedure;
若需要添加输入参数@Username:
param = new SqlParameter("@Username", SqlDbType.DateTime);
param.Direction = ParameterDirection.Input;
param.Value = username;
da.selectCommand.Parameters.Add(param);
若需要添加输出参数@out:
param = new SqlParameter("@out", SqlDbType.DateTime);
param.Direction = ParameterDirection.Output; '输出参数
执行查询语句: comm.ExecuteNonQuery();
int Out=param.Value;
若要获得参储过程的返回值:@RETURN_VALUE是默认的返回参数
param = new SqlParameter("@RETURN_VALUE", SqlDbType.DateTime);
param.Direction = ParameterDirection.ReturnValue; '返回值:
执行查询语句: comm.ExecuteNonQuery();
int Out=param.Value; //Out就是返回参数值
================
三、例子
例1: 下面的存储过程实现用户验证的功能,如果不成功,返回0,成功则返回1.
CREATE PROCEDURE VALIDATE @USERNAME CHAR(20),@PASSWORD CHAR(20),@LEGAL BIT OUTPUT
AS
IF EXISTS(SELECT * FROM REN WHERE SNAME = @USERNAME AND PWD = @PASSWORD)
SELECT @LEGAL = 1
ELSE
SELECT @LEGAL = 0
在程序中调用该存储过程,并根据@LEGAL参数的值判断用户是否合法。
.net 中显示返回值主要代码
comm.Parameters.Add("@LEGAL", 0);
comm.Parameters["@LEGAL"].Direction = ParameterDirection.Output;
comm.ExecuteNonQuery(); //ExecuteNonQuery:返回影响的行数
i = (int)comm.Parameters["@LEGAL"].Value;
Response.Write(i.ToString());
例2:返回存储过程OUTPUT参复和RETURN返回值的原代码
ALTER PROCEDURE sp_2
@p int output,
@p1 int,
@p2 int
as
set @p = @p1+@p2
return 99
SqlCommand cmd=new SqlCommand();
cmd.Connection=conn;
cmd.CommandText = "sp_2";
cmd.CommandType = CommandType.StoredProcedure;
'@return_value"这个参数在输入参数的最前面,名称是固定的
SqlParameter param=cmd.CreateParameter("@return_value", adInteger, adParamReturnValue);
cmd.Parameters.Add(param);
'输入和输出的参数顺序同存储过程的参数顺序
param=cmd.CreateParameter("@p", adInteger, adParamOutput);
cmd.Parameters.Add(param);
param= cmd.CreateParameter("@p1", adInteger, adParamInput,,1)
cmd.Parameters.Add(param);
param=cmd.CreateParameter("@p2", adInteger, adParamInput,,2)
cmd.ExecuteNonQuery();
For i = 0 To cmd.Parameters.Count - 1
for( int i;i<cmd.Parameters.Count - 1,i++)
Response.write(cmd.Parameters(i).Name & "=" & cmd.Parameters(i).Value)
cmd.Connection.Close();
结果:
@return_value=99
@p=3
@p2=2
@p1=1
四、如何在存储过程中调用存储过程?
create table test(id int,name varchar(10))
insert into test select 1,'AAAA'
insert into test select 2,'BBBB'
go
create procedure sp_test1(@count int output)
as
select @count=count(*) from test
go
create procedure sp_test2
as
begin
declare @count int
exec sp_test1 @count output
select @count
end
go
exec sp_test2
go
--输出结果
/*
2
*/