溫習一下存儲過程

很久沒用存儲過程了,撈個例子出來剖析剖析,溫習一下sql

1.例子數據庫

  set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goide

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) = 0ui

  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 -- 此處可根據客戶需求更改
  ENDthis

END
     上面是一個簡單的例子,輸入一個工單種類@GDZL,獲得工單編號@GDBHspa

          (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 的行。get

          (2)該存儲過程調用了很多系統函數,是個比較經典的例子:input

        如: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

該參數表示從某操做(如存儲過程、內置函數或用戶定義的函數)返回的值。

相關文章
相關標籤/搜索