探讨SQL Server存储过程
A.;;;获取存储过程的ReturnValue值用了这么长时间的.NET了,竟然连怎么获取存储过程的返回值都不知道,真是失败。 在网上搜了一下,就知道怎么用了。 Input 此参数只用于将信息从应用程序传输到存储过程。 InputOutput 此参数可将信息从应用程序传输到存储过程,并将信息从存储过程传输回应用程序。 Output 此参数只用于将信息从存储过程传输回应用程序。 ReturnValue 此参数表示存储过程的返回值。SQL Server 的存储过程参数列表中不显示该参数。它只与存储过程的 RETURN 语句中的值相关联。
存储过程为主键生成新值后,通常使用存储过程中的 RETURN 语句返回该值,因此用来访问该值的参数类型是 ReturnValue 参数。 ReturnValue 参数与其他类型的参数有一个重要的区别。通常,在 ADO.NET 中为 Command 对象配置的参数的顺序并不重要。参数名称只用来与存储过程中相应的参数相匹配。但是,对于 ReturnValue 参数,它必须是列表中的第一个参数。 也就是说,为 Command 对象配置 ReturnValue 参数时,必须首先在代码中配置该参数,这样它才能获取集合中的第一个数字索引。如果先配置任何其他参数,ReturnValue 参数将不能正常工作。 呵呵,这样就可以了 args[0] = new SqlParameter('@RETURN_VALUE', SqlDbType.Int ); args[0].Direction = ParameterDirection.ReturnValue;
取回值的时候用args[0].Value.ToString()
B.获得SQL-server存储过程的返回值存储过程为:
///<summary> ///c#code,获得SQL-server存储过程的返回值 ///<summary> SqlParameter[] sp = new SqlParameter[5]; sp[0]=new SqlParameter('@Name',SqlDbType.VarChar); sp[0].Value=this.TextName.Text; sp[1]=new SqlParameter('@Text',SqlDbType.Text); sp[1].Value=this.TextTxt.Text; sp[2]=new SqlParameter('@Comment',SqlDbType.Text); sp[2].Value=this.TextComment.Text; sp[3]=new System.Data.SqlClient.SqlParameter('ReturnValue',System.Data.SqlDbType.Int,4,System.Data.ParameterDirection.ReturnValue,false,0,0,string.Empty,DataRowVersion.Default,null); //参数'ReturnValue',System.Data.ParameterDirection.ReturnValue声明此参数为返回值。 sp[4]=new SqlParameter('@Type',SqlDbType.Int); sp[4].Value=int.Parse(this.ClickBox.SelectedItem.Value); _SQL.ExecuteSP('us_styletextnew',sp); //使用sp[3].Value.ToString()即可!
存储过程为:
CREATE PROCEDURE [dbo].[us_styletextnew]@id int=0,@Name varchar(50),@Text text,@Comment text,@Type intASSET NOCOUNT ONIF not EXISTS(SELECT [Name] FROM [dbo].[iStyle] WHERE [Name] = @Name)BEGININSERT INTO [dbo].[iStyle] ([Name], [Text], [Comment], [Type])VALUES (@Name,@Text,@Comment,@Type)SET @id = SCOPE_IDENTITY()ENDRETURN @idGO
希望对刚学存储过程的朋友有点帮助!
用过SQLHelper的朋友,一定很怀疑SQLHelper怎么不能执行带输出、返回参数的存储过程呢?请参考 http://blog.joycode.com/ghj/archive/2004/04/12/19015.aspx
此文并没有做成相应的解决方法,所以这也是写本文的一个出发点。原因值需要修改存储过程中RETURN @id为SELECT @id,取值采用SqlHelper.ExecuteScalar 方法.其中原理并没有违背SqlHelper.ExecuteScalar取第一行一列的值。
string aa= SqlHelper.ExecuteScalar(SqlHelper.CONN_STRING,'PRO_Table1_OPER',sp).ToString();
C.如何在存储过程中引用别的存储过程返回的表
1.;;;;一般的方法认为只有把存储过程返回的值,写入一个结构相同的 辅助表中,如下: create procedure proc1 as begin create table #t(...) --表结构同被调用存储过程返回结果集的结构
insert #t exec proc2
select * from #t left join table on ... end go
2。还有一个方面就是用openrowset(不过就是速度不怎么样) select * from openrowset('sqloledb' ,'Trusted_Connection=yes' ,'exec sp_who') -- 这里是你要调用的存储过程参考文献 :http://www.linkui.cn/read-20.htmlhttp://blog.joycode.com/ghj/archive/2004/04/12/19015.aspx