欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-15 16:10:53
经常需要查一些信息, 想写视图来返回数据以提高效率,但是用试视图不能传参,只好想到改存储过程。记录一下语法,方便以后做项目时候想不起来了用。 1:传字段返回datatable 2: 传字段回一串字符 3: 传字符串返回datable 4:存储过程调用存储过程 --加半个小时(select datea ......

 

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

 

 

 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         }