[转]Sql server 创建带参数存储过程

Sql server 创建带参数存储过程

在SQL Server 的存储过程中,支持输入(Input)、输出参数(Output),也支持返回值参数(ReturnValue)

关于输入参数,大家都很好理解,就是我们提供数值给存储过程,这就好比是编程中的按值传递(ByVal)的形参。该参数传递到存储过程后,经过处理,但调用方是不可以得到经过处理之后的值的。

而输出参数,则类似于编程中的按引用传递(ByRef)的形参。也就是说,该参数传递到存储过程之后,可以在调用方得到处理过后的值。

返回值参数不是一个形参,而类似于编程中的返回值类型。它都是通过Return语句来返回的,而且在SQL Server中,必须返回INT型的数据,而且很显然,只能有一个返回值,因为RETURN语句其实是会终止存储过程的。

下面来看看一个例子

ALTER PROCEDURE [dbo].[GetCustomers]
(@rowcount INT OUTPUT)
AS
    SELECT [CustomerID]
      ,[CompanyName]
      ,[ContactName]
      ,[ContactTitle]
      ,[Address]
      ,[City]
      ,[Region]
      ,[PostalCode]
      ,[Country]
      ,[Phone]
      ,[Fax]
FROM [Northwind].[dbo].[Customers]
SET @rowcount=@@rowcount

上面这个存储过程是通过一个输出参数,来接收一个行计数。

要实现同样的功能,也可以用返回值参数

ALTER PROCEDURE [dbo].[GetCustomers]
AS
    SELECT [CustomerID]
      ,[CompanyName]
      ,[ContactName]
      ,[ContactTitle]
      ,[Address]
      ,[City]
      ,[Region]
      ,[PostalCode]
      ,[Country]
      ,[Phone]
      ,[Fax]
FROM [Northwind].[dbo].[Customers]
RETURN @@rowcount

那么,如何在别的存储过程中调用该存储过程,并且接收它的输出参数或者返回值参数呢

下面是接收输出参数的示例

DECLARE @count INT
EXECUTE GetCustomers @count OUTPUT
PRINT @count

下面是接收返回值参数的示例

DECLARE @count INT
EXECUTE @count=GetCustomers
PRINT @count

/*下面给出个C#调用的例子*/

C#调用存储过程(带返回值)和SQL Server DTS的方法。
  在程序开发中,我们经常要做的事就是访问资料库.有时候会调用存储过程和DTS,下面就此给出例子来说明如何实现

  第一部分 调用存储过程(带入参数和取得返回值)

  1.调用SQL Server的存储过程

  假如我们有如下一个存储过程,很简单的实现,只是将两个传进来值做加法处理然后返回

CREATE PROCEDURE AddMethod
(
  @returnvalue int OUTPUT,   --返回结果
  @Parameter_1 int,          --参数一
  @Parameter_2 int           --参数二
)
AS
-----------------------------------------------
set @returnvalue = @Parameter_1 + @Parameter_2
RETURN @returnvalue
-------------------------------------------------
GO以下是在c#中调用此存储过程的代码

    private int TestProcedure()
    {
      System.Random rnd = new Random();
      string constr = "Data Source=localhost;initial catalog=testdb;user id=sa;password=sa;connect timeout=3000";
      SqlConnection conn = new SqlConnection(constr);
      conn.Open();
      SqlCommand cmd = new SqlCommand();
      cmd.Connection = conn;
      cmd.CommandText = "AddMethod";
      cmd.CommandType = CommandType.StoredProcedure;
      //参数一
      SqlParameter parameter_1 = new SqlParameter("@Parameter_1",SqlDbType.Int);
      parameter_1.Direction = ParameterDirection.Input;
      parameter_1.Value = (int)(rnd.NextDouble() * 100);
      //参数二
      SqlParameter parameter_2 = new SqlParameter("@Parameter_2",SqlDbType.Int);
      parameter_2.Direction = ParameterDirection.Input;
      parameter_2.Value = (int)(rnd.NextDouble() * 100);
      //返回值
      SqlParameter returnValue = new SqlParameter("@returnValue",SqlDbType.Int);
      returnValue.Direction = ParameterDirection.Output;
      cmd.Parameters.Add(returnValue);
      cmd.Parameters.Add(parameter_1);
      cmd.Parameters.Add(parameter_2);
      try
      {
        cmd.ExecuteNonQuery();   
      }
      finally
      {
        conn.Close();
      }
      return (int)returnValue.Value;
    }

原文地址:https://www.cnblogs.com/luqingfei/p/1917963.html