首页 > 代码库 > 存储过程实例
存储过程实例
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+‘1‘where id=@id --进行相应处理(跟据需要填入SQL文)fetch next from cursor1 into @id,@name --将游标向下移1行endclose cursor1 --关闭游标deallocate cursor1
存储过程实例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。