首页 > 代码库 > 存储过程实例

存储过程实例

Alter PROCEDURE [dbo].[calc_MRScoreLevel] (  @ipd_no nvarchar(12),        --住院号  @MRScore  Float output,     --病案得分  @MRLever  NVarchar(10) output   --病案等级 )ASBEGIN     --声明变量             DECLARE @ItemType NVARCHAR(12) --缺陷类型            declare @DefectScore nchar(10),@CheckCount int            declare @haveYL nchar(10)    --声明游标 赋值      declare mycursor cursor for      select s.ItemType,s.DefectScore,sr.CheckCount              from MRD_Score s WITH(NOLOCK)             left join MRD_ScoreResult sr with(nolock) on s.PCode=sr.PCode and s.ItemCode=sr.ItemCode             where IPD_NO=@ipd_no                          open mycursor                 --读取第一行             fetch next from mycursor into @ItemType,@DefectScore,@CheckCount                          while(@@fetch_status = 0)             begin               if @CheckCount IS NOT NULL AND len(@checkCount)>0    -- 存在已审核                 begin                 --如果缺陷类型是 单项否决(丙)                  IF  @ItemType =03                        BEGIN                            SET @MRLever = 丙级                            return;                        END                  --如果缺陷类型是 单项否决(乙),分数>75=乙,else 丙                  ELSE if @ItemType=02                        BEGIN                                                        SET @haveYL =Y                            Set @MRScore =@MRScore+ CONVERT(Float,@DefectScore) * @CheckCount;                                                  END                  ELSE --常规 根据分数定等级                      BEGIN                                              SET @MRLever =甲级                       set @MRScore = @MRScore + convert(Float,@DefectScore) * @CheckCount                                          end                 end                 -- 下一行                 fetch next from mycursor into @ItemType,@DefectScore,@CheckCount              END              --根据缺陷类型返回相应的值                if @haveYL=Y                    begin                       if @MRScore >=75 set @MRLever=乙级                       else set @MRLever=丙级                     end                else                        begin                        if @MRScore >=90 set @MRLever=甲级                          else if (@MRScore >=75 and @MRScore <90) set @MRLever=乙级                        else set @MRLever=丙级                    end                             close mycursor             deallocate mycursor End

 

存储过程执行结果,分别为output类型和Return Value类型:

 技术分享

C#调用过程:

public DataTable GetMRScoreAndLever(string ipd_no, float score, string lever)       {           SqlParameter[] para = {                                      new SqlParameter("@ipd_no",ipd_no),                                     new SqlParameter("@MRScore", score),                                     new SqlParameter("@MRLever", lever)                                   };           para[1].Direction = ParameterDirection.InputOutput;            para[2].Direction = ParameterDirection.InputOutput;            int count = 0;            int resutlt = DbHelperSQL.RunProcedure("calc_MedicalRecordScore", para, out count);            object o = para[1].Value;           string MRScore =para[1].Value.ToString(); //分数            string MRLever = para[2].Value.ToString();//等级Convert.IsDBNull           DataTable dttemp = new DataTable();           DataRow newRow = dttemp.NewRow();           dttemp.Columns.Add("MRScore");           dttemp.Columns.Add("MRLever");           newRow["MRScore"] = MRScore;           newRow["MRLever"] = MRLever;           dttemp.Rows.InsertAt(newRow, 0);           return dttemp;       }
其中ParameterDirection.InputOutput:参数类型为output类型,ParameterDirection.ReturnValue:参数类型为OutputReturnValue类型。

  使用的是执行存储过程的方法ExecuteNonQuery(),而不是查询方法。

 1 public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected) 2         { 3             using (SqlConnection connection = new SqlConnection(connectionString)) 4             { 5                 int result; 6                 connection.Open(); 7                 SqlCommand command = BuildIntCommand(connection, storedProcName, parameters); 8                 rowsAffected = command.ExecuteNonQuery(); 9                 result = (int)command.Parameters["ReturnValue"].Value;10                 //Connection.Close();11                 return result;12             }13         }

 

最后附上 游标的用法:

declare @id intdeclare @name varchar(50)declare cursor1 cursor for         --定义游标cursor1select * from table1               --使用游标的对象(跟据需要填入select文)open cursor1                       --打开游标fetch next from cursor1 into @id,@name  --(读取第一行)将游标向下移1行,获取的数据放入之前定义的变量@id,@name中while @@fetch_status=0           --判断是否成功获取数据(有数据=0)beginupdate table1 set name=name+1where id=@id                           --进行相应处理(跟据需要填入SQL文)fetch next from cursor1 into @id,@name  --将游标向下移1行endclose cursor1                   --关闭游标deallocate cursor1

 

存储过程实例