好久没用存储过程了,捞个例子出来剖析剖析,温习一下

1.例子

  set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[UP_GetNew_GDBH]
(  @GDZL VARCHAR(10),----------------------------暂时注释
   @GDBH VARCHAR(20) OUTPUT
)
AS
BEGIN

  DECLARE @xh INT
  DECLARE @Date DATETIME
  SET @Date = GetDate()
  declare @gdjx varchar(20)---------------------我后来自己修改添加了
  select @gdjx=JX from YW_GDZL where GDZL=@GDZL------------我后来自己修改添加了
  SELECT @xh = MAX([XH]) FROM SEQ_GDBH WHERE DateDiff(mm, [SLSJ], @Date) = 0

  IF @xh IS NULL -- 没有本月的编号
  BEGIN
    INSERT INTO SEQ_GDBH([SLSJ], [XH]) VALUES(@Date, 1)
    SET @GDBH = Convert(varchar(6), @Date, 112) + @gdjx + '000001' -- 此处可根据客户需求更改
  END
  ELSE
  BEGIN
    DECLARE @cc VARCHAR(6)
    SET @cc = Cast((@xh + 1) AS VARCHAR)
    INSERT INTO SEQ_GDBH([SLSJ], [XH]) VALUES(@Date, @xh + 1)
    SET @GDBH = Convert(varchar(6), @Date, 112) + @gdjx + Replicate('0', 6 - Len(@cc)) + @cc -- 此处可根据客户需求更改
  END

END
     上面是一个简单的例子,输入一个工单种类@GDZL,得到工单编号@GDBH

          (1)首先解释下 set ANSI_NULLS ON
                    set QUOTED_IDENTIFIER ON 的用法:

                 这些是 SQL-92 设置语句,使 SQL Server 2000/2005 遵从 SQL-92 规则。
当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须符合所有 Transact-SQL 标识符规则。 
                 L-92 标准要求在对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中包含非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍会返回零行。
当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中包含非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行。

          (2)该存储过程调用了不少系统函数,是个比较经典的例子:

        如:GetDate(),MAX([XH]),DateDiff(mm, [SLSJ], @Date) = 0,

                 connvert(varchar(6), @Date, 112),Cast((@xh + 1),

                 Replicate('0', 6 - Len(@cc))等等 

         (3)DBSqlHelper里的简单调用

           public static DataSet RunProcedure(string storedProcName, SqlParameter[] parameters)
        {
            using (SqlConnection connection = new SqlConnection(db))
            {
                DataSet dataSet = new DataSet();
                connection.Open();
                SqlDataAdapter sqlDA = new SqlDataAdapter();
                sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
                sqlDA.Fill(dataSet);
                connection.Close();
                return dataSet;
            }
        }


        /// <summary>
        /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
        /// </summary>
        /// <param name="connection">数据库连接</param>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <returns>SqlCommand</returns>
        private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, SqlParameter[] parameters)
        {
            SqlCommand command = new SqlCommand(storedProcName, connection);
            command.CommandType = CommandType.StoredProcedure;
            if (parameters != null)
            {
                foreach (SqlParameter pa in parameters)
                {
                    command.Parameters.Add(pa);
                }
                   
               
            }
            return command;
        }

     

           (4)dal层里的调用

  public string cunchu1( )
        {
            string strname = "UP_GetNew_GDBH";
            SqlParameter[] listp =  {
                                         new  SqlParameter("@GDZL",SqlDbType.VarChar,10),
                                         new SqlParameter("@GDBH",SqlDbType.VarChar,20)
                                    };

            listp[0].Value = "2";
            listp[1].Direction = ParameterDirection.Output;
          
            DBHelper.RunProcedure(strname, listp);
            object obj = listp[1].Value;
            return obj.ToString();
        }

  

提供 ParameterDirection 属性

Input

该参数为输入参数。这是默认设置。

InputOutput

该参数可执行输入和输出。

Output

该参数为输出参数。

ReturnValue

该参数表示从某操作(如存储过程、内置函数或用户定义的函数)返回的值。

 input  

该参数为输入参数。这是默认设置。

output

该参数为输出参数

inputoutput

该参数可执行输入和输出。

returnvalue

该参数表示从某操作(如存储过程、内置函数或用户定义的函数)返回的值。

 

                            以上就是自己总结的调用存储过程一个小例子,简单易懂。

Input

该参数为输入参数。这是默认设置。

InputOutput

该参数可执行输入和输出。

Output

该参数为输出参数。

ReturnValue

该参数表示从某操作(如存储过程、内置函数或用户定义的函数)返回的值。