zoukankan      html  css  js  c++  java
  • sqlserver存储过程里传字段、传字符串,并返回DataTable、字符串,存储过程调用存储过程。

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

     1:传字段返回datatable

     2: 传字段回一串字符

     3: 传字符串返回datable

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

     5:存储过程里写分页

     6:sqlserver里检验写好的存储过程遇到的问题(分页返回table)段2 为解决办法。

    --加半个小时
    (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         }
    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  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  }
    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 =@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         }
    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              --@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         }
    View Code

    5:存储过程里写分页

               调用:

    USE [eSystem]
    GO

    DECLARE @return_value int

    EXEC @return_value = [dbo].[xsp_ination]
    @tblName = N't_FormOperationRecord',
    @strGetFields = N'Id,UploadDownloadId ,Operationtime,OptName',
    @fldName = N'Id',
    @PageSize = 10,
    @PageIndex = 220,
    @OrderType = 1

    SELECT 'Return Value' = @return_value

    GO

    sql = "EXEC [dbo].[xsp_ination] "tblNEWS","*","id",40," + pindex.ToString() + ",1,"iType=" + type.ToString(); 

    SqlDataReader sr = ExecuteReader(sql);  
    while (sr.Read())  
    {  
       ...  
    }  
    sr.Close(); 

    View Code

    6:检验写好的存储过程查不出结果集(分页返回table),段2 为解决办法。

         写了一个分页模板的存储过程见下段代码,在sqlserver工具,选定执行的存储过程,右键execute,然后就输入各个参数,执行完毕啥都没有,语法如段1, 然后以为存储过程写的有问题,换了很多种方法,结果集都为空,然后搜到了一个别人的检验的语法,如段2,就出来了。仔细看了,段1  @return_value 返回整个查询结果,可是为什么 自定义的是int  型 的,去掉了直接赋参执行存储过程还是不出数据。       段二EXEC 直接执行存储过程就返回整个结果了。  找到了以前写的单独的存储过程返回table 的如段3,看到里面结束时候也没有select,但是为什么直接在工具里execute就能出结果, 一时没有想明白是什么原因,要去写其他代码了,有时间了在回来整理这个问题。

    存储过程

     1 USE [ ]
     2 GO
     3 
     4 /****** Object:  StoredProcedure [dbo].[proc_PagingStoredProcedure]    Script Date: 7/22/2020 10:03:17 AM ******/
     5 SET ANSI_NULLS ON
     6 GO
     7 
     8 SET QUOTED_IDENTIFIER ON
     9 GO
    10 
    11 
    12 
    13 
    14 ALTER
    15   PROCEDURE [dbo].[proc_PagingStoredProcedure]  
    16     @TableFields NVARCHAR(512),
    17     @TableName NVARCHAR(512),
    18     @SqlWhere NVARCHAR(512),
    19     @OrderBy NVARCHAR(64),
    20     @PageIndex INT,
    21     @PageSize INT,
    22     @TotalCount INT OUTPUT
    23 AS
    24     DECLARE @SQL1 NVARCHAR(2048) , @SQL2 NVARCHAR(2048)    --@SQL1和@SQL2最好设置为比较长的字符串,否则会因为SQL语句过长而导致执行失败
    25     SET @SQL1 = N'SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderBy + ') AS NID, ' 
    26     + @TableFields + ' FROM ' + @TableName +
    27      ' WHERE ' + @SqlWhere + ') as TmpTable WHERE TmpTable.NID BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex* @PageSize '
    28     SET @SQL2 = N'@TableFields NVARCHAR(512),@TableName NVARCHAR(512),@SqlWhere NVARCHAR(512),@OrderBy NVARCHAR(64),@PageIndex INT,@PageSize INT,@TotalCount INT OUTPUT'
    29 EXEC SP_EXECUTESQL @SQL1,  @SQL2, @TableFields, @TableName, @SqlWhere,@OrderBy,@PageIndex,@PageSize,@TotalCount OUTPUT
    30 PRINT @SQL1    --打印执行语句  
    31 GO 
    存储过程
     1 USE [XXG_PIP]
     2 GO
     3 
     4 DECLARE    @return_value int,
     5         @TotalCount int
     6 
     7 EXEC    @return_value = [dbo].[proc_PagingStoredProcedure]
     8         @TableFields = N'id',
     9         @TableName = N't_State',
    10         @SqlWhere = NULL,
    11         @OrderBy = N'id',
    12         @PageIndex = 1,
    13         @PageSize = 3,
    14         @TotalCount = @TotalCount OUTPUT
    15 
    16 SELECT    @TotalCount as N'@TotalCount'
    17  
    18 
    19 GO
    段1
     1 GO    --测试 
     2 DECLARE @Count INT = 0
     3 EXEC proc_PagingStoredProcedure
     4  'Id  ,CreateTime ,CreateUserId
     5    ,Remark
     6    ,[State] 
     7    ,ISNULL( [LastUpdateUserId],0) as LastUpdateUserId
     8    ,ISNULL( [StateName],''暂无'') as StateName
     9    ,ISNULL( [LastUpdateTime],'''') as LastUpdateTime',  --字段
    10  't_State', --表名
    11  '1=1', --条件
    12  'Id',--id
    13   2, --页码
    14   3,--行数
    15   @Count OUTPUT      
    段2
     1 USE [FormSystem]
     2 GO
     3 
     4 /****** Object:  StoredProcedure [dbo].[proc_getFormSelect]    Script Date: 7/22/2020 10:49:56 AM ******/
     5 SET ANSI_NULLS ON
     6 GO
     7 
     8 SET QUOTED_IDENTIFIER ON
     9 GO
    10 
    11 
    12 
    13 
    14 
    15 
    16 
    17 
    18 -- =============================================
    19 -- Author:        <Author,,Name>
    20 -- Create date: <Create Date,,>
    21 -- Description:    
    22 -- =============================================
    23 CREATE  PROCEDURE [dbo].[proc_getFormSelect]
    24          @pagesize  int,       
    25          @pageindex  int,
    26          @Str_filter NVARCHAR(MAX) 
    27 AS
    28  
    29 
    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 tf.CreateTime  DESC) as Num,';
    41 
    42 set @sql=@sql+'  tf.Id , tf.FormName , tf.FilePath , tf.FormNumber , tf.DepId , td.DepName, 
    43                      tf.ProjectId ,tp.ProjectName,tf.FileName,
    44                       tf.SetFlowId ,  tf.Remark , tf.state , tf.CreateUserId , tf.CreateTime ,tf.LastUpdateTime , tf.LastUpdateUserId, 
    45                       tu2.name as CreateUser ,tu3.name as LastUpdateUser,tsf.FlowName    from t_Form  tf
    46                      left join t_department td on  tf.DepId=td.id
    47                       left join t_Project tp on  tf.ProjectId=tp.id
    48                       left join t_SetFlow tsf on tf.SetFlowId= tsf.id
    49                       left  join t_user tu2  on  tu2.Id= tf.CreateUserId
    50                       left  join t_user tu3  on   tu3.Id= tf.LastUpdateUserId
    51        where 1=1 '
    52     
    53          --加表单名称查询条件     tf.State=0
    54       if(@Str_filter != '' or @Str_filter !=null)
    55         set @sql=@sql+ @Str_filter;
    56            
    57   set @sql=@sql+'  ) Info where Num between  @a  and @b '          
    58  
    59      EXEC sp_executesql @sql ,N'@a int , @b int', @a=@num1,@b=@num2 
    60 END
    61 GO
    段3
  • 相关阅读:
    LeetCode-079-单词搜索
    awk学习笔记
    Python实现排列组合算法
    python模拟登录人人
    Python的SQLite数据库使用方法
    C语言排序算法——插入排序算法
    C语言排序算法——简单选择排序算法
    C语言排序算法——冒泡排序算法
    Python学习——python的函数参数传递
    Python学习——实现secure copy功能
  • 原文地址:https://www.cnblogs.com/xiangrikui94/p/11572100.html
Copyright © 2011-2022 走看看