• [转]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;
        }

  • 相关阅读:
    python函数完整语法和分类
    python数据类型int、float、str、list、dict、set定义及常用方法汇总
    python语言之流程控制
    python用户交互、基本数据类型、运算符
    BZOJ 3925: [Zjoi2015] 地震后的幻想乡(概率DP)
    BZOJ 3566 概率充电器(树形概率DP)
    BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 (高斯消元)
    BZOJ 3589 动态树 (树链剖分+线段树)
    BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)
    BZOJ 4013/Luogu P3240 [HNOI2015] 实验比较 (树形DP)
  • 原文地址:https://www.cnblogs.com/luqingfei/p/1917963.html
Copyright © 2020-2023  润新知