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

 

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

 

 

 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         }

 

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐