经常需要查一些信息, 想写视图来返回数据以提高效率,但是用试视图不能传参,只好想到改存储过程。记录一下语法,方便以后做项目时候想不起来了用。
1:传字段返回datatable
2: 传字段回一串字符
3: 传字符串返回datable
4:存储过程调用存储过程
--加半个小时
(select dateadd(MINUTE,30,GETDATE() ))--UnLockTime 往后加半个小时 CONVERT(varchar(100), @UnLockTime, 20)
--转成可以拼接字符串的格式
set @strOutput='0~由于您最近输错5次密码已被锁定,请在'+CONVERT(varchar(100), @UnLockTime, 20) +'之后再尝试登录~'+CAST(@Id AS NVARCHAR(10))
1:传字段返回datatable
1 //传字段返回datatable 2 USE [ ] 3 GO 4 5 /****** Object: StoredProcedure [dbo].[proc_getIsAPProveRoleUserIdSelect] Script Date: 9/23/2019 10:35:46 AM ******/ 6 SET ANSI_NULLS ON 7 GO 8 9 SET QUOTED_IDENTIFIER ON 10 GO 11 12 13 -- ============================================= 14 -- Author: <Author,,Name> 15 -- Create date: <Create Date,,> 16 -- Description: 添加工作组人员时查找满足条件的审批人信息 17 -- ============================================= 18 ALTER PROCEDURE [dbo].[proc_getIsAPProveRoleUserIdSelect] 19 @ProjectId int, --项目id 20 @DepId int , --部门id 21 @RoleId1 int , --权限id 22 @RoleId2 int , --权限id 23 @RoleId3 int--权限id 24 25 AS 26 BEGIN 27 select id from t_user where DepId=@DepId and State=0 and (RoleId=@RoleId1 or RoleId=@RoleId2 or RoleId=@RoleId3) 28 union 29 select id from t_user where id in ( 30 select UserId as id from t_User_Project where ProjectId=@ProjectId and State=0) 31 and (RoleId=@RoleId1 or RoleId=@RoleId2 or RoleId=@RoleId3) 32 33 34 END 35 GO 36 37 38 public static string getIsAPProveRoleUserId(int ProjectId, int DepId) 39 { 40 string Rtstr = ""; 41 string strSql = string.Format("proc_getIsAPProveRoleUserIdSelect"); 42 IList<KeyValue> sqlpara = new List<KeyValue> 43 { 44 new KeyValue{Key="@ProjectId",Value=ProjectId}, 45 new KeyValue{Key="@DepId",Value=DepId}, 46 new KeyValue{Key="@RoleId1",Value=Convert.ToInt32(UserRole.Administrators)}, 47 new KeyValue{Key="@RoleId2",Value=Convert.ToInt32(UserRole.DepartmentLeader)}, 48 new KeyValue{Key="@RoleId3",Value=Convert.ToInt32(UserRole.divisionManager) } 49 50 }; 51 DataTable dt = sqlhelper.RunProcedureForDataSet(strSql, sqlpara); 52 53 54 if (dt != null && dt.Rows.Count > 0) 55 { 56 for (int i = 0; i < dt.Rows.Count; i++) 57 { 58 Rtstr += dt.Rows[i]["id"].ToString() + ","; 59 } 60 } 61 if (Rtstr.Length > 1) 62 { 63 Rtstr = Rtstr.Remove(Rtstr.Length - 1, 1); 64 } 65 return Rtstr; 66 } 67 68 69 70 71 72 73 74 /// <summary> 75 /// 带参数执行存储过程并返回DataTable 76 /// </summary> 77 /// <param name="str_conn">数据库链接名称</param> 78 /// <param name="str_sql">SQL脚本</param> 79 /// <param name="ilst_params">参数列表</param> 80 /// <returns></returns> 81 public DataTable RunProcedureForDataSet( string str_sql, IList<KeyValue> ilst_params) 82 { 83 using (SqlConnection sqlCon = new SqlConnection(connectionString)) 84 { 85 sqlCon.Open(); 86 DataSet ds = new DataSet(); 87 SqlDataAdapter objDa = new SqlDataAdapter(str_sql, sqlCon); 88 objDa.SelectCommand.CommandType = CommandType.StoredProcedure; 89 FillPram(objDa.SelectCommand.Parameters, ilst_params); 90 objDa.Fill(ds); 91 DataTable dt = ds.Tables[0]; 92 return dt; 93 } 94 }
2: 传字段返回一串字符
1 // 返回一串字符 2 GO 3 4 /****** Object: StoredProcedure [dbo].[proc_LoginOutPut] Script Date: 9/23/2019 1:04:29 PM ******/ 5 SET ANSI_NULLS ON 6 GO 7 8 SET QUOTED_IDENTIFIER ON 9 GO 10 11 12 -- ============================================= 13 -- Author: <Author,,Name> 14 -- Create date: <2019-04-25 15:00:00,> 15 -- Description: <登录的方法> 16 -- 查询用户名是否存在, 17 -- 不存在: 18 -- 返回: 用户名或密码错误 请检查。 19 -- 存在: 20 -- 判断用户名和密码是否匹配 21 -- 匹配,看连续密码输入次数是否>0<5 22 -- 是,清除次数, 直接登录获取更详细信息———————— 返回 23 -- 否:看解锁时间是否大于等于当前时间(是:清除解锁时间、清除次数、改状态0),返回详细信息 24 -- (否:返回,您当前处于锁定状态,请在XX时间后进行登录 ) 25 -- 不匹配: 26 -- 根据account 查找id给该用户加一次锁定次数,判断有没有到5次,有:更改锁定状态和解锁时间 27 -- 没有:返回您输入的账号或密码错误 28 29 -- ============================================= 30 31 32 ALTER PROCEDURE [dbo].[proc_LoginOutPut] 33 @Account varchar(20), --账号 34 @Pwd varchar(50), --密码 35 @strOutput VARCHAR(100) output --输出内容 36 37 --输出格式:0~由于您最近输错5次密码已被锁定,请在XX之后再尝试登录~id。 id 不存在写0.存在写自己id 38 --0~用户名或密码错误~id。 39 -- 1~id~id 40 -- -1~发生错误~id 41 -- -1~发生错误 0不成功 1 登录成功 42 AS 43 44 BEGIN 45 SET XACT_ABORT ON--如果出错,会将transcation设置为uncommittable状态 46 declare @PasswordIncorrectNumber int --连续密码输入次数 47 declare @Id int --用户id 48 declare @count int --用户匹配行数 49 declare @UnLockTime datetime --解锁时间 50 51 BEGIN TRANSACTION 52 -- 开始逻辑判断 53 54 ----------非空判断 55 if(@Account = '' or @Account is null or @Pwd='' or @Pwd is null) 56 57 begin 58 set @strOutput='0~未获取到信息,请稍后重试~0' 59 return @strOutput 60 end 61 ----------非空判断结束 62 63 64 else 65 begin 66 set @Id=(select id from t_user where Account=@Account or AdAccount=@Account) 67 -- 1:查询用户名是否存在 68 if @Id>0--说明账号存在 69 begin 70 set @count=(select count(id) from t_user where (Account=@Account and Pwd=@Pwd) or (AdAccount=@Account and Pwd=@Pwd)) 71 if @count=1 72 begin 73 set @PasswordIncorrectNumber=(select PasswordIncorrectNumber from t_user where id=@Id) 74 --看连续密码输入次数是否>0 <5 75 if @PasswordIncorrectNumber<5 76 begin 77 --清除次数, 直接登录获取更详细信息———————— 返回 78 update t_user set PasswordIncorrectNumber=0 ,UnLockTime=null ,State=0 79 from t_user where id=@Id 80 set @strOutput= '1~'+ '登录成功'+'~'+CAST(@Id AS NVARCHAR(10)) 81 82 select CAST(@strOutput AS NVARCHAR(20)) 83 84 85 86 87 end 88 else --次数大于5,已经被锁住 89 begin 90 -- 看解锁时间是否大于等于当前时间(是:清除解锁时间、清除次数、改状态0),返回详细信息 91 set @UnLockTime=(select [UnLockTime] from t_user where id=@Id) 92 if @UnLockTime>GETDATE() 93 begin 94 set @strOutput='0~由于您最近输错5次密码已被锁定,请在'+CONVERT(varchar(100), @UnLockTime, 20) +'之后再尝试登录~'+CAST(@Id AS NVARCHAR(10)) 95 -- select @strOutput 96 end 97 else --清除解锁时间、清除次数、改状态0 98 begin 99 update t_user set PasswordIncorrectNumber=0 ,State=0,UnLockTime=null 100 from t_user where id=@Id 101 set @strOutput= '1~'+ '登录成功'+'~'+CAST(@Id AS NVARCHAR(10)) 102 select @strOutput 103 end 104 end 105 106 end 107 else -- 账号和密码不匹配,但是属于我们系统用户 。 108 begin 109 -- 根据id给该用户加一次锁定次数,判断有没有到5次,有:更改锁定状态和解锁时间 110 update t_user set PasswordIncorrectNumber=PasswordIncorrectNumber+1 111 from t_user where id=@Id 112 set @PasswordIncorrectNumber=(select PasswordIncorrectNumber from t_user where id=@Id) 113 if @PasswordIncorrectNumber>4 114 begin 115 set @UnLockTime=(select dateadd(MINUTE,30,GETDATE() ))--UnLockTime 往后加半个小时 CONVERT(varchar(100), @UnLockTime, 20) 116 update t_user set State=1,UnLockTime=@UnLockTime 117 from t_user where id=@Id -- State=1锁定, 118 119 INSERT INTO t_user_Log (pId , Account , AdAccount , Pwd , Name , DepId , RoleId , Email , Tel , State , PasswordIncorrectNumber , UnLockTime , CreateUserId , NextUpdatePwdTime) 120 SELECT @Id,Account , AdAccount , Pwd , Name , DepId , RoleId , Email , Tel , State , PasswordIncorrectNumber , UnLockTime , CreateUserId , NextUpdatePwdTime 121 FROM t_user WHERE t_user.Id=@Id 122 123 124 125 set @UnLockTime= CONVERT(varchar(100), @UnLockTime, 20) 126 set @strOutput='0~由于您最近输错5次密码已被锁定,请在'+CONVERT(varchar(100), @UnLockTime, 20) +'之后再尝试登录~'+CAST(@Id AS NVARCHAR(10)) 127 select @strOutput 128 end 129 else -- 130 begin 131 132 set @strOutput='0~用户名或密码错误'+'~'+CAST(@Id AS NVARCHAR(10)) 133 select @strOutput 134 end 135 end 136 end 137 else --不存在 返回: 2~不是我们用户,不用加登录日志。 138 begin 139 set @strOutput='2~不是我们用户,不用加登录日志'+'~0' 140 select @strOutput 141 end 142 end 143 144 IF @@error <> 0 --发生错误 145 146 BEGIN 147 148 ROLLBACK TRANSACTION 149 set @strOutput='-1~发生错误~0' 150 151 SELECT @strOutput 152 153 END 154 155 ELSE 156 157 BEGIN 158 159 COMMIT TRANSACTION 160 161 --执行成功 RETURN 1 162 163 SELECT @strOutput 164 END 165 END 166 GO 167 168 169 //调用 170 171 /// <summary> 172 /// 检验用户账号 173 /// </summary> 174 /// <param name="user"></param> 175 /// <returns></returns> 176 public static string CheckUser(EnUser user) 177 { 178 179 string sql = string.Format("proc_LoginOutPut"); 180 181 List<KeyValue> paralist = new List<KeyValue>(); 182 paralist.Add(new KeyValue { Key = "@Account", Value = user.Account }); 183 paralist.Add(new KeyValue { Key = "@Pwd", Value = user.Pwd }); 184 object Objreturn = SQLHelper.RunProcedureForObject(sql, "strOutput", paralist); 185 String returnStr = ""; 186 if (Objreturn != null) 187 { 188 returnStr = Objreturn.ToString(); 189 190 } 191 if (returnStr.Length > 0) 192 { 193 return returnStr; 194 195 } 196 else 197 { 198 return ""; 199 } 200 } 201 202 //sqlhelper 203 204 /// <summary> 205 /// 带参数执行存储过程并返回指定参数 206 /// </summary> 207 /// <param name="str_conn">数据库链接名称</param> 208 /// <param name="str_sql">SQL脚本</param> 209 /// <param name="str_returnName">返回值的变量名</param> 210 /// <param name="ilst_params">参数列表</param> 211 /// <returns>存储过程返回的参数</returns> 212 public static object RunProcedureForObject( string str_sql, string str_returnName, IList<KeyValue> ilst_params) 213 { 214 using (SqlConnection sqlCon = new SqlConnection(connectionString)) 215 { 216 sqlCon.Open(); 217 SqlCommand sqlCmd = sqlCon.CreateCommand(); 218 sqlCmd.CommandType = CommandType.StoredProcedure; 219 sqlCmd.CommandText = str_sql; 220 FillPram(sqlCmd.Parameters, ilst_params); 221 //添加返回值参数 222 SqlParameter param_outValue = new SqlParameter(str_returnName, SqlDbType.VarChar, 100); 223 param_outValue.Direction = ParameterDirection.InputOutput; 224 param_outValue.Value = string.Empty; 225 sqlCmd.Parameters.Add(param_outValue); 226 //执行存储过程 227 sqlCmd.ExecuteNonQuery(); 228 //获得存过过程执行后的返回值 229 return param_outValue.Value; 230 } 231 }
3: 传字符串返回datable
1 //传字符串返回datable 2 //加整段查询信息 3 4 USE [FormSystem] 5 GO 6 7 /****** Object: StoredProcedure [dbo].[proc_FormOperationRecordManagepage] Script Date: 9/23/2019 1:06:14 PM ******/ 8 SET ANSI_NULLS ON 9 GO 10 11 SET QUOTED_IDENTIFIER ON 12 GO 13 14 15 16 17 18 19 20 -- ============================================= 21 -- Author: <Author,,Name> 22 -- Create date: <Create Date,,> 23 -- Description: 24 -- ============================================= 25 ALTER PROCEDURE [dbo].[proc_FormOperationRecordManagepage] 26 @pagesize int, 27 @pageindex int, 28 @Str_filter NVARCHAR(MAX) 29 AS 30 BEGIN 31 DECLARE @sql NVARCHAR(MAX) , 32 @num1 int, 33 @num2 int 34 35 set @num1= @pagesize*(@pageindex-1)+1; 36 set @num2 =@pagesize*@pageindex; 37 set @sql='SELECT * FROM 38 ( 39 SELECT 40 ROW_NUMBER() over( order by fr.OptTimestamp DESC) as Num,'; 41 42 set @sql=@sql+' fr.[Id] 43 ,tp.ProjectName 44 ,td.DepName 45 ,tf.FormName 46 ,ud.UploadFileName 47 ,fr.OptName 48 , tu1.Name as OptUserName 49 , tu2.Name as DownUserName 50 ,[Operationtime] 51 ,[OptTimestamp] 52 ,fr.[Remark] 53 ,ud.DownTime 54 ,ud.Id as UploadDownloadId 55 FROM [FormSystem].[dbo].[t_FormOperationRecord] fr 56 left join t_UploadDownload ud on ud.id=fr.UploadDownloadId 57 left join t_Form tf on tf.id=ud.FormId 58 left join t_Project tp on tf.ProjectId=tp.Id 59 left join t_department td on tf.DepId=td.Id 60 left join t_user tu1 on tu1.Id=fr.OptUserId 61 left join t_user tu2 on tu2.Id=ud.DownUserId 62 where 1=1 ' 63 64 --加表单名称查询条件 tf.State=0 65 if(@Str_filter != '' or @Str_filter !=null) 66 set @sql=@sql+ @Str_filter; 67 68 set @sql=@sql+' ) Info where Num between @a and @b ' 69 70 EXEC sp_executesql @sql ,N'@a int , @b int', @a=@num1,@b=@num2 71 END 72 GO 73 74 75 76 public static List<EnFormOperationRecord> GetFormOperationRecordList(int pageindex, int pagesize, 77 object str_filter) 78 { 79 string strSql = string.Format("proc_FormOperationRecordManagepage"); 80 IList<KeyValue> sqlpara = new List<KeyValue> 81 { 82 new KeyValue{Key="@pagesize",Value=pagesize}, 83 new KeyValue{Key="@pageindex",Value=pageindex}, 84 new KeyValue{Key="@Str_filter",Value=str_filter} 85 }; 86 DataTable dt = sqlhelper.RunProcedureForDataSet(strSql, sqlpara); 87 List<EnFormOperationRecord> list = new List<EnFormOperationRecord>(); 88 if (dt != null && dt.Rows.Count > 0) 89 { 90 for (int i = 0; i < dt.Rows.Count; i++) 91 { 92 EnFormOperationRecord tb = new EnFormOperationRecord(); 93 tb.Num = Convert.ToInt16(dt.Rows[i]["Num"].ToString()); 94 } 95 } 96 return list; 97 } 98 99 100 /// <summary> 101 /// 带参数执行存储过程并返回DataTable 102 /// </summary> 103 /// <param name="str_conn">数据库链接名称</param> 104 /// <param name="str_sql">SQL脚本</param> 105 /// <param name="ilst_params">参数列表</param> 106 /// <returns></returns> 107 public DataTable RunProcedureForDataSet( string str_sql, IList<KeyValue> ilst_params) 108 { 109 using (SqlConnection sqlCon = new SqlConnection(connectionString)) 110 { 111 sqlCon.Open(); 112 DataSet ds = new DataSet(); 113 SqlDataAdapter objDa = new SqlDataAdapter(str_sql, sqlCon); 114 objDa.SelectCommand.CommandType = CommandType.StoredProcedure; 115 FillPram(objDa.SelectCommand.Parameters, ilst_params); 116 objDa.Fill(ds); 117 DataTable dt = ds.Tables[0]; 118 return dt; 119 } 120 }
4:存储过程调用存储过程
1 //存储过程调用存储过程 2 3 USE[FormSystem] 4 GO 5 6 /****** Object: StoredProcedure [dbo].[proc_SendEmail] Script Date: 9/23/2019 1:09:46 PM ******/ 7 SET ANSI_NULLS ON 8 GO 9 10 SET QUOTED_IDENTIFIER ON 11 GO 12 13 14 15 -- ============================================= 16 -- Author: <Author,,Name> 17 -- Create date: <Create Date,,> 18 -- Description: 19 -- ============================================= 20 ALTER PROCEDURE[dbo].[proc_SendEmail] 21 @MailToAddress varchar(50) , 22 @subTitle varchar(200), 23 @msg varchar(max) , 24 @SendUserId int , 25 @ControlLevel int , 26 @UploadDownloadId int, 27 @ReceivedUserId int 28 AS 29 30 31 BEGIN 32 print @MailToAddress; 33 print @subTitle; 34 print @msg; 35 36 if(len(@MailToAddress)>10) 37 begin 38 EXEC msdb.dbo.sp_send_dbmail @recipients = @MailToAddress, 39 @copy_recipients= '', 40 --@blind_copy_recipients= '1634454@163.com', 41 @body= @msg, 42 @body_format= 'html', 43 @subject = @subTitle, 44 @profile_name = 'e-Form'; 45 begin 46 insert into t_EmailLog(UploadDownloadId, 47 ReceivedUserId, SendResult, SendUserId, ControlLevel, 48 EmailContent, Email) 49 values(@UploadDownloadId, @ReceivedUserId, 0, @SendUserId, 50 @ControlLevel, @msg, @MailToAddress); 51 end 52 end 53 END 54 GO 55 56 57 public static object Send(string Subject, string content, string adress, Ent_EmailLog EmailLog) 58 { 59 string sql = string.Format("proc_SendEmail"); 60 List<KeyValue> paralist = new List<KeyValue>(); 61 paralist.Add(new KeyValue { Key = "@MailToAddress", Value = adress }); 62 paralist.Add(new KeyValue { Key = "@subTitle", Value = Subject }); 63 paralist.Add(new KeyValue { Key = "@msg", Value = content }); 64 paralist.Add(new KeyValue { Key = "@SendUserId", Value = EmailLog.SendUserId }); 65 paralist.Add(new KeyValue { Key = "@ControlLevel", Value = EmailLog.ControlLevel }); 66 paralist.Add(new KeyValue { Key = "@UploadDownloadId", Value = EmailLog.UploadDownloadId }); 67 paralist.Add(new KeyValue { Key = "@ReceivedUserId", Value = EmailLog.ReceivedUserId }); 68 object Objreturn = SQLHelper.ProcedureForObject(sql, paralist); 69 return Objreturn; 70 } 71 72 73 /// <summary> 74 /// 带参数执行存储过程 75 /// </summary> 76 /// <param name="str_conn">数据库链接名称</param> 77 /// <param name="str_sql">SQL脚本</param> 78 /// <param name="ilst_params">参数列表</param> 79 public static object ProcedureForObject(string str_sql, IList<KeyValue> ilst_params) 80 { 81 //如果换到正式要把这里改成 82 using (SqlConnection sqlCon = new SqlConnection(connectionString2)) 83 // using (SqlConnection sqlCon = new SqlConnection(connectionString)) 84 { 85 sqlCon.Open(); 86 SqlCommand sqlCmd = sqlCon.CreateCommand(); 87 sqlCmd.CommandType = CommandType.StoredProcedure; 88 sqlCmd.CommandText = str_sql; 89 FillPram(sqlCmd.Parameters, ilst_params); 90 ////添加返回值参数 91 //SqlParameter param_outValue = new SqlParameter(str_returnName, SqlDbType.VarChar, 100); 92 //param_outValue.Direction = ParameterDirection.InputOutput; 93 //param_outValue.Value = string.Empty; 94 //sqlCmd.Parameters.Add(param_outValue); 95 //执行存储过程 96 return sqlCmd.ExecuteNonQuery(); 97 //获得存过过程执行后的返回值 98 //return param_outValue.Value; 99 } 100 }