加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver存储过程里传字段、传字符串,并返回DataTable、字符串

发布时间:2020-12-12 14:16:45 所属栏目:MsSql教程 来源:网络整理
导读:? ? ? ? ? ? ?经常需要查一些信息,? 想写视图来返回数据以提高效率,但是用试视图不能传参,只好想到改存储过程。记录一下语法,方便以后做项目时候想不起来了用。 ? ? ?1:传字段返回datatable ?2:?传字段回一串字符 ?3: 传字符串返回datable ?4:存储过

?

? ? ? ? ? ?经常需要查一些信息,? 想写视图来返回数据以提高效率,但是用试视图不能传参,只好想到改存储过程。记录一下语法,方便以后做项目时候想不起来了用。

?

?

?1:传字段返回datatable

?2:?传字段回一串字符

?3: 传字符串返回datable

?4:存储过程调用存储过程

?

?

?

--加半个小时
(select dateadd(MINUTE,30,GETDATE() ))--UnLockTime 往后加半个小时 CONVERT(varchar(100),@UnLockTime,20)

--转成可以拼接字符串的格式
set @strOutput=‘0~由于您最近输错5次密码已被锁定,请在‘+CONVERT(varchar(100),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   [email?protected] and    State=0  and  ([email?protected] or  [email?protected] or  RoleId=@RoleId3)  
28    union
29     select id   from t_user where  id  in (
30     select UserId  as id from  t_User_Project where [email?protected]  and    State=0) 
31      and   ([email?protected] or  [email?protected]  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         }
View Code

?

??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  [email?protected]   or AdAccount=@Account)
 67                 -- 1:查询用户名是否存在
 68                  if   @Id>0--说明账号存在
 69                       begin 
 70                       set  @count=(select count(id)  from   t_user   where  ([email?protected] and [email?protected]) or ([email?protected] 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),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),20)
116                                                   update t_user set   State=1,UnLockTime=@UnLockTime
117                                                    from   t_user  where  [email?protected]   -- 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,NextUpdatePwdTime
121                                                      FROM t_user WHERE  t_user.Id=@Id
122                                                       
123 
124 
125                                                    set @UnLockTime=   CONVERT(varchar(100),20) 
126                                                    set @strOutput=0~由于您最近输错5次密码已被锁定,请在+CONVERT(varchar(100),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  }
View Code

?

?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 [email?protected]*@pageindex;
 37 set @sql=SELECT * FROM
 38                 (
 39                      SELECT  
 40                             ROW_NUMBER() over(  order by fr.OptTimestamp  DESC) as Num,;
 41 
 42 set @[email?protected]+    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 @[email?protected]+ @Str_filter;
 67            
 68   set @[email?protected]+  ) Info where Num between  @a  and @b           
 69  
 70      EXEC sp_executesql @sql,N@a int,@b int,@[email?protected],@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         }
View Code

?

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              [email?protected]_copy_recipients= [email?protected], 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,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         }
View Code

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读