SQL中存储过程sql调用存储过程程,怎么取返回值

SQL一个存储过程调用另一个存储过程 获取返回值问题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
SQL一个存储过程调用另一个存储过程 获取返回值问题
上传于||文档简介
&&S​Q​L​一​个​存​储​过​程​调​用​另​一​个​存​储​过​程​ ​获​取​返​回​值​问​题
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢[转]在存储过程中如何使用另一个存储过程返回的结果集 - skysowe - 博客园
随笔 - 25, 文章 - 0, 评论 - 1, 引用 - 0
在存储过程中如何使用另一个存储过程返回的结果集
原文地址:/zdkai/archive//2730461.html
与这个问题具有相同性质的其他描述还包括:如何在存储过程中检索动态SQL语句的执行结果?如何实现类似SELECT * FROM (EXEC procedure_name @parameters_var) AS datasource WHERE ... 的功能?procedure_name是一个存储过程的名字,@parameters_var是过程参数如何将一个存储过程的执行结果记录集传递给另一个存储过程?存储过程中如何根据另一个存储过程的执行结果选择执行流程?存储过程中如何根据动态SQL语句的查询结果更改执行流程?一个存储过程A使用另一个存储过程B的名字(或一段SQL语句或一个不确定的表名,字段名)作为参数,如何在不改动存储过程B的情况下,对存储过程B的执行结果记录集进行过滤/更改,再将过滤/更改后的结果集返回给存储过程A的调用者?上面这些问题都有一个共同点,那就是都希望对存储过程(或动态SQL语句)的执行结果进行再处理,但是标准的SQL语句只能处理数据表,而一个存储过程(或动态SQL语句)的执行结果虽然是记录集,但它们本身不能当做数据表来处理。这样就大大限制了存储过程(或动态SQL语句)的应用范围,它们只能作为将记录集返回给应用程序前的最后一个处理层。如果我们可以像使用普通的数据表那样使用存储过程(或动态SQL语句)该有多好。这个问题我以前的解决方法是使用OPENQUERY()或OPENDATASOURCE(),但OPENQUERY()不仅要求建立一个链接服务器,而且执行性能也让人无法满意。OPENDATASOURCE()则要求提供连接字符串,这对系统后期的维护也是一个很大的麻烦。今天使用SQL Server联机丛书时无意中发现了一条SQL语句,竟然非常方便的解决了这个问题。这个语句就是INSERT语句。INSERT语句在帮助中的定义是这样的:INSERT [ INTO]{ table_name WITH ( & table_hint_limited & [ ...n ] )| view_name| rowset_function_limited}{ [ ( column_list ) ]{ VALUES( { DEFAULT | NULL | expression } [ ,...n] )| derived_table| execute_statement}}| DEFAULT VALUES其中execute_statement的解释是"任何有效的 EXECUTE 语句,它使用 SELECT 或 READTEXT 语句返回数据。"。通常我们放在这个位置的就是一段SELECT语句。但帮助既然说"任何有效的 EXECUTE 语句",那么"EXEC procedure_name"也应该可以罗?想到这一点,马上决定动手验证一下。验证结果证实没问题。即下面这样的语句INSERT INTO table_name EXEC procedure_name @parameters_var确实可以正常工作。有了这个基础,我们也就有了解决本文开头那些问题的方法。基本思路是先创建一个临时表,通过INSERT ... EXEC ...语句将存储过程的返回结果保存到临时表中,接下来就可以像处理普通数据表那样对待这个临时表了。对于动态SQL语句,可以通过dbo.sp_executesql存储过程执行,或者直接作为EXEC的参数执行。具体的编写要求可以参考SQL Server联机丛书。这里只特别说明一下,临时表的表结构与存储过程(或动态SQL语句)返回的记录集的表结构兼容即可,不要求完全相同。如果直接通过EXEC执行动态SQL语句,SQL语句有4K的长度限制。最后给出两种最常见的处理流程:1。创建一个临时表#tmp,表结构与目标存储过程procedure_name的返回结果集兼容(兼容即可,不必相同)。CREATE TABLE #tmp([columns_list])2。执行存储过程并将存储过程的返回结果集插入临时表。INSERT INTO #tmp EXEC procedure_name @parameters_var3。现在可以使用(过滤,更改或检索)#tmp了。^_^IF EXISTS(SELECT * FROM #tmp)BEGIN--执行分支1END ELSE BEGIN--执行分支2END4。别忘了最后清除临时表。DROP TABLE #tmp对于动态SQL语句,只要将第二步改为INSERT INTO #tmp EXEC dbo.sp_executesql @querystring_var即可。1121人阅读
存储过程return与output区别
共同点:都返回值(但return只能返回int类型)&&&&
1.output是定义变量是不是可以返回值&&&&
2.output没有return从查询或过程中无条件退出的工功&&&&
3.return返回值在函数和过程定义时不需要用output来定义&
我想用存储过程,是一个查询的存储过程. 把查询的记录返回.net里我接收这个返回的记录集. 怎么弄呀?
------------------------------
(1)执行一个没有参数的存储过程的代码如下:&
SqlConnection conn=new SqlConnection(“connectionString”);&
SqlDataAdapter da = new SqlDataAdapter();&
da.selectCommand = new SqlCommand();&
da.selectCommand.Connection =&
mandText = &NameOfProcedure&;&
mandType = CommandType.StoredP
(2)执行一个有参数的存储过程的代码如下&
SqlConnection conn=new SqlConnection(“connectionString”);&
SqlDataAdapter da = new SqlDataAdapter();&
da.selectCommand = new SqlCommand();&
da.selectCommand.Connection =&
mandText = &NameOfProcedure&;&
mandType = CommandType.StoredP&
param = new SqlParameter(&@ParameterName&, SqlDbType.DateTime);&
param.Direction = ParameterDirection.I&
param.Value = Convert.ToDateTime(inputdate);&
da.selectCommand.Parameters.Add(param);
若需要添加输出参数:
param = new SqlParameter(&@ParameterName&, SqlDbType.DateTime);&
param.Direction = ParameterDirection.O '输出参数
param.Value = Convert.ToDateTime(inputdate);&
da.selectCommand.Parameters.Add(param);
若要获得参储过程的返回值:
param = new SqlParameter(&@ParameterName&, SqlDbType.DateTime);&
param.Direction = ParameterDirection.ReturnV '返回值:
param.Value = Convert.ToDateTime(inputdate);&
da.selectCommand.Parameters.Add(param);
=================
在asp.net中调用存储过程代码:
&&&&&&& int i = 2;
&&&&&&& string ConnStr = &server=.;database=uid=pwd=&;
&&&&&&& SqlConnection conn = new SqlConnection(ConnStr);
&&&&&&& SqlCommand comm = new SqlCommand(&proc_stu&, conn);&&&&&&& //建立一个命令
&&&&&&& mandType = CommandType.StoredP&&&&&&&&& //说明执行的是一个存储过程
&&&&&&& comm.Parameters.Add(new SqlParameter(&@sname&, SqlDbType.Char, 20));&&& //定义一个存储过程变量
&&&&&&& comm.Parameters[&@sname&].Value = &admin&;&&&&&&&&& //给存储过程变量赋值
&&&&&&& comm.Parameters.Add(new SqlParameter(&@pwd&, SqlDbType.Char, 20));&&& //定义一个存储过程变量
&&&&&&& comm.Parameters[&@pwd&].Value = &admin&;
&&&&&&& comm.Connection.Open();&&&&&&&&&&&&&&& //打开连接
&&&&&&& try
&&&&&&&&&& i= (int)comm.ExecuteScalar();&&&&&&&&&&&&&& // ExecuteScalar:返回第一行第一列值&&&&&&&&
&&&&&&& catch (SqlException er)
&&&&&&&&&&& Response.Write(er.ToString());&&&&&&&&&&&& //向上一级抛异常
&&&&&&& finally
&&&&&&&&&&& comm.Connection.Close();
&&&&&&&&&&& conn.Close();
&&&&&&& Response.Write(i.ToString());
存储过程既可以在查询分析器中编写,也可以在企业管理器中编写。最重要是学会其语法。SQL Sever 联机帮助中有详细的说明。下面的存储过程实现用户验证的功能,如果不成功,返回0,成功则返回1.
CREATE PROCEDURE VALIDATE @USERNAME CHAR(20),@PASSWORD CHAR(20),@LEGAL BIT OUTPUT&
IF EXISTS(SELECT * FROM REN WHERE SNAME = @USERNAME AND PWD = @PASSWORD)&
SELECT @LEGAL = 1&
SELECT @LEGAL = 0
在程序中调用该存储过程,并根据@LEGAL参数的值判断用户是否合法。
.net 中显示返回值主要代码
comm.Parameters.Add(&@LEGAL&, 0);
comm.Parameters[&@LEGAL&].Direction = ParameterDirection.O
comm.ExecuteNonQuery();&&& //ExecuteNonQuery:返回影响的行数
i = (int)comm.Parameters[&@LEGAL&].V&&&
Response.Write(i.ToString());
===============================
  两种不同的存储过程调用方法
  为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的“官方”方法。另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明。本文所有例子均采用C#语言。
  要在应用程序中访问数据库,一般性的步骤是:首先声明一个数据库连接SqlConnection,然后声明一个数据库命令SqlCommand,用来执行SQL语句和存储过程。有了这两个对象后,就可以根据自己的需要采用不同的执行方式达到目的。需要补充的是,不要忘记在页面上添加如下的引用语句:using System.Data.SqlClient。
  就执行存储过程来说,如果执行的是第一类存储过程,那么就要用一个DataAdapter将结果填充到一个DataSet中,然后就可以使用数据网格控件将结果呈现在页面上了;如果执行的是第二和第三种存储过程,则不需要此过程,只需要根据特定的返回判定操作是否成功完成即可。
(1)执行一个没有参数的存储过程的代码如下:
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection =
mandText = &NameOfProcedure&;
mandType = CommandType.StoredP
然后只要选择适当的方式执行此处过程,用于不同的目的即可。
(2)执行一个有参数的存储过程的代码如下(我们可以将调用存储过程的函数声明为ExeProcedure(string inputdate)):
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection =
mandText = &NameOfProcedure&;
mandType = CommandType.StoredP
(以上代码相同,以下为要添加的代码)
param = new SqlParameter(&@ParameterName&, SqlDbType.DateTime);
param.Direction = ParameterDirection.I
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);
这样就添加了一个输入参数。若需要添加输出参数:
param = new SqlParameter(&@ParameterName&, SqlDbType.DateTime);
param.Direction = ParameterDirection.O
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);
若要获得参储过程的返回值:
param = new SqlParameter(&@ParameterName&, SqlDbType.DateTime);
param.Direction = ParameterDirection.ReturnV
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);
  从上面的代码我们可以看出,当存储过程比较多或者存储过程的参数比较多时,这种方法会大大影响开发的速度;另外一方面,如果项目比较大,那么这些用于数据库逻辑的函数在以后的维护中也是一个很大的负担。那么,有没有一种改进的方法可以解决这个问题呢?想到在执行没有参数的存储过程时只需要传入一个存储过程的名字就可以调用相应的存储过程,而且在SqlServer数据库中我们可以直接在查询分析器中敲入“存储过程名(参数列表)”样的字符串就可以执行存储过程,那么,是否可以把这种思想应用到应用程序中呢?
  于是在编译器中键入相应代码。这些代码是在调用不带参数的存储过程的代码的基础上改的。具体代码如下:
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection =
mandText = &NameOfProcedure(’para1’,’para2’,para3)&;
mandType = CommandType.StoredP
  为了使代码更具有代表性,要调用的存储过程的第一个和第二个参数都为字符串类型,第三个参数为整型。执行以后发现,完全可以达到预期的效果!
  两种调用方法的比较
  通过比较我们可以看到,第二种方法具有一个很明显的优点,那就是可以提高开发速度,节省开发时间,而且代码容易维护,在一定程度上也减少了系统大小。但是,由于对存储过程参数的处理比较笼统,如果要获取输出参数或者得到存储过程的返回值,这种方法就不能满足需要了。虽然如此,但是,这种方法毕竟可以让开发人员少些很大一部分的代码。如果不需要获取输出参数和返回值,那么几乎可以做到“一劳永逸”。因此在实际的程序开发中,这种方法还是具有一定的实用价值的。
=================
Public Shared Function kwkj_user_serverInRole_addrole(ByVal username As String, ByVal rolename As String, ByVal serveronid As Integer, ByVal yearnum As Integer) As Integer
&&&&&&& Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings(&LocalSqlServer&).ConnectionString)
&&&&&&&&&&& Using command As New SqlCommand(&kwkj_user_ServerInRole_addrole1&, connection)
&&&&&&&&&&&&&&& mandType = CommandType.StoredProcedure
&&&&&&&&&&&&&&& Dim p As SqlParameter = command.Parameters.Add(&@Return_Value&, SqlDbType.Int)&&&&&&& '标准参数的写法
&&&&&&&&&&&&&&& p.Direction = ParameterDirection.ReturnValue'& 定义参数的传输类型是returnvalue&
&&&&&&&&&&&&&&& command.Parameters.Add(New SqlParameter(&@username&, username))
&&&&&&&&&&&&&&& command.Parameters.Add(New SqlParameter(&@rolename&, rolename))
&&&&&&&&&&&&&&& command.Parameters.Add(New SqlParameter(&@serveronid&, serveronid))
&&&&&&&&&&&&&&& command.Parameters.Add(New SqlParameter(&@yearnum&, yearnum))
&&&&&&&&&&&&&&& Dim list As Integer
&&&&&&&&&&&&&&& Try
&&&&&&&&&&&&&&&&&&& connection.Open()
&&&&&&&&&&&&&&&&&&& command.ExecuteNonQuery()
&&&&&&&&&&&&&&&&&&& list = CInt(p.Value)& '取得存储过程的返回值
&&&&&&&&&&&&&&& Catch ex As Exception
&&&&&&&&&&&&&&& Finally
&&&&&&&&&&&&&&&&&&& connection.Close()
&&&&&&&&&&&&&&& End Try
&&&&&&&&&&&&&&& Return list&& '返回值
&&&&&&&&&&& End Using
&&&&&&& End Using
&&& End Function
========================
返回存储过程OUTPUT参复和RETURN返回值的原代码
---------------------------------
ALTER PROCEDURE sp_2
@p int output,
set @p = @p1+@p2
---------------------------------
提供各类教程
Function returnP()
&&& Dim cmd As mand
&&& Set cmd.ActiveConnection = CurrentProject.Connection
&&&&&这个参数在输入参数的最前面,名称是固定的
cmd.Parameters.Append cmd.CreateParameter(&@return_value&, adInteger, adParamReturnValue)
'输入和输出的参数顺序同存储过程的参数顺序&
&&& cmd.Parameters.Append cmd.CreateParameter(&@p&, adInteger, adParamOutput)&&&&
&&& cmd.Parameters.Append cmd.CreateParameter(&@p1&, adInteger, adParamInput,,1)
&&& cmd.Parameters.Append cmd.CreateParameter(&@p2&, adInteger, adParamInput,,2)&
&&& mandText = &sp_2&
&&& mandType = adCmdStoredProc
&&& cmd.Execute
&&& Dim i As Integer&
&&& For i = 0 To cmd.Parameters.Count - 1
&&&&&&& Debug.Print cmd.Parameters(i).Name & &=& & cmd.Parameters(i).Value
&&& Next i
Set cmd.ActiveConnection = Nothing&
Set cmd = Nothing&
End Function
'----------测试---------
? returnP()
@return_value=99
============================&
如何在存储过程中调用存储过程?大家给个例子?&
create&& proc&& kk&&&
& begin&&&
& exec&& jj&&&& --jj为存储过程名&&&
& end&&&&&
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)&&&
&&&&&&&&& select&& @count=count(*)&& from&& test&&&
& go&&&&&&&
& create&& procedure&& sp_test2&&&
& begin&&&
&&&&&&&&& declare&& @count&& int&&&
&&&&&&&&& exec&& sp_test1&& @count&& output&&&&&
&&&&&&&&& select&& @count&&&
& exec&& sp_test2&&&
& --输出结果&&&
& drop&& procedure&& sp_test2,sp_test1&&&
& drop&& table&& test&&&
---------------------
1,存储过程
create proc dbo.SPd_test
2,得到return 的值
DECLARE @RC int
EXEC @RC = [eppoo].[dbo].[SPd_test]&
DECLARE @PrnLine nvarchar(4000)
PRINT ''''存储过程: eppoo.dbo.SPd_test''''
SELECT @PrnLine = '''' 返回代码 = '''' + CONVERT(nvarchar, @RC)
PRINT @PrnLine&
------------
来自CSDN网站linjimu博客
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23157次
排名:千里之外
转载:38篇
(1)(2)(1)(6)(1)(1)(2)(5)(2)(1)(1)(15)(8).Net 调用存储过程取到return的返回值
投稿:whsnow
字体:[ ] 类型:转载 时间:
存储过程只能返回 int 类型,如果返回一个字符串 ,将会报类型转化错误,下面以示例介绍下如何取到return的值,需要的朋友可以参考下
1. 存储过程
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
-- =============================================
-- Author: &Author,,Name&
-- Create date: &Create Date,,&
-- Description: &Description,,&
-- =============================================
alter PROCEDURE GetOrderLine
@orderId varchar(50)
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
select * from orderLine where OrderId = @orderId;
return 123;
&注意 存储过程只能返回 int 类型,如果返回一个字符串 ,将会报类型转化错误
2 后台调用
DataTable dt = new DataTable();
string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["BLL.Properties.Settings.ShoppingDBConnectionString"].ToString();
using(SqlConnection conn= new SqlConnection(connStr)){
string callName = "GetOrderLine";
using (SqlCommand command = new SqlCommand(callName, conn))
mandType = CommandType.StoredP
SqlParameter[] sps = { new SqlParameter("@orderId",SqlDbType.VarChar,50) ,
new SqlParameter("@return",SqlDbType.Int) //注册返回值类型
sps[0].Value = "43c7cf15-6b2f-4d18-92b2-dbe827f30dfc";
sps[1].Direction = ParameterDirection.ReturnV //返回参数类型
command.Parameters.AddRange(sps);
using(SqlDataAdapter sda =new SqlDataAdapter()){
sda.SelectCommand =
sda.Fill(dt);
//Console.WriteLine(sda.GetFillParameters()[1].Value);
Console.WriteLine(sps[1].Value); //取到返回的值
if(dt.Rows.Count&0){
for (int i = 0; i & dt.Rows.Ci++ )
Console.WriteLine(dt.Rows[i]["ProductId"]+":"+dt.Rows[i]["ProductPrice"]+":"+dt.Rows[i]["ProductCount"]);
Console.ReadLine();
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 sql 存储过程中返回值 的文章

 

随机推荐