CREATE PROCEDURE SP_PagingLarge @TableNames VARCHAR(300),--表名,可以是多个表,但不能用别名 @PrimaryKey VARCHAR(100),--主键,可以为空,但@Order为空时该值不能为空 @Fields VARCHAR(350),--要取出的字段,可以是多个表的字段,可以为空,为空表示select * @PageSize INT,--每页记录数 @CurrentPage INT,--当前页,0表示第1页 @Filter VARCHAR(200) = '',--条件,可以为空,不用填 where @Group VARCHAR(200) = '',--分组依据,可以为空,不用填 group by @Order VARCHAR(200) = '',--排序,可以为空,为空默认按主键升序排列,不用填 order by @RecordCount int = 0 output AS BEGIN DECLARE @SortColumn VARCHAR(200) DECLARE @Operator CHAR(2) DECLARE @SortTable VARCHAR(200) DECLARE @SortName VARCHAR(200) DECLARE @TmpSelect NVarchar(200) IF @Fields = '' SET @Fields = '*' IF @Filter = '' SET @Filter = 'WHERE 1=1' ELSE SET @Filter = 'WHERE ' + @Filter IF @Group <>'' SET @Group = 'GROUP BY ' + @Group IF @Order <> '' BEGIN DECLARE @pos1 INT,@pos2 INT SET @Order = REPLACE(REPLACE(@Order,' asc',' ASC'),' desc',' DESC') IF CHARINDEX(' DESC',@Order) > 0 IF CHARINDEX(' ASC',@Order) > 0 BEGIN IF CHARINDEX(' DESC',@Order) < CHARINDEX(' ASC',@Order) SET @Operator = '<=' ELSE SET @Operator = '>=' END ELSE SET @Operator = '<=' ELSE SET @Operator = '>=' SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order,' ASC',''),' DESC',' ','') SET @pos1 = CHARINDEX(',',@SortColumn) IF @pos1 > 0 SET @SortColumn = SUBSTRING(@SortColumn,1,@pos1-1) SET @pos2 = CHARINDEX('.',@SortColumn) IF @pos2 > 0 BEGIN SET @SortTable = SUBSTRING(@SortColumn,@pos2-1) IF @pos1 > 0 SET @SortName = SUBSTRING(@SortColumn,@pos2+1,@pos1-@pos2-1) ELSE SET @SortName = SUBSTRING(@SortColumn,LEN(@SortColumn)-@pos2) END ELSE BEGIN SET @SortTable = @TableNames SET @SortName = @SortColumn END END ELSE BEGIN SET @SortColumn = @PrimaryKey SET @SortTable = @TableNames SET @SortName = @SortColumn SET @Order = @SortColumn SET @Operator = '>=' END DECLARE @type varchar(50) DECLARE @prec int SELECT @type=t.name,@prec=c.prec FROM sysobjects o JOIN syscolumns c on o.id=c.id JOIN systypes t on c.xusertype=t.xusertype WHERE o.name = @SortTable AND c.name = @SortName IF CHARINDEX('char',@type) > 0 SET @type = @type + '(' + CAST(@prec AS varchar) + ')' DECLARE @TopRows INT SET @TopRows = @PageSize * @CurrentPage + 1 print @TopRows print @Operator EXEC(' DECLARE @SortColumnBegin ' + @type + ' SET ROWCOUNT ' + @TopRows + ' SELECT @SortColumnBegin=' + @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' ORDER BY ' + @Order + ' SET ROWCOUNT ' + @PageSize + ' SELECT ' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' ORDER BY ' + @Order + ' ') DECLARE @str_Count_sql nvarchar(500) SET @str_Count_sql= 'SELECT @TotalCount=count('+@PrimaryKey+') FROM ' + @TableNames + ' ' + @Filter EXEC sp_executesql @str_Count_sql,N'@TotalCount int=0 output',@RecordCount output End GO
C#中运用:
// 创建用于执行存储过程的 sqlCommand。 private static sqlCommand CreatesqlCommand(string storeProcedureName,sqlConnection connection) { sqlCommand command = new sqlCommand(storeProcedureName,connection); command.CommandType = CommandType.StoredProcedure; return command; } /// <summary> /// 从在 System.Data.sqlClient.sqlCommand 中指定的存储过程中检索参数信息并填充指定的 /// System.Data.sqlClient.sqlCommand 对象的 System.Data.sqlClient.sqlCommand.Parameters 集合。 /// </summary> /// <param name="sqlCommand">将从其中导出参数信息的存储过程的 System.Data.sqlClient.sqlCommand 对象。</param> static internal void DeriveParameters(sqlCommand sqlCommand) { try { sqlCommand.Connection.open(); sqlCommandBuilder.DeriveParameters(sqlCommand); sqlCommand.Connection.Close(); } catch { if (sqlCommand.Connection != null) { sqlCommand.Connection.Close(); } throw; } } // 用指定的参数值列表为存储过程参数赋值。 private static void AssignParameterValues(sqlCommand sqlCommand,params object[] paraValues) { if (paraValues != null) { if ((sqlCommand.Parameters.Count - 1) != paraValues.Length) { throw new ArgumentNullException("储存过程参数个数不匹配."); } for (int i = 0; i < paraValues.Length; i++) { sqlCommand.Parameters[i + 1].Value = (paraValues[i] == null) ? dbnull.Value : paraValues[i]; } } }
/// <summary> /// 执行存储过程,返回 System.Data.DataTable。 /// </summary> /// <param name="paraValues">传递给存储过程的参数值列表。</param> /// <returns>包含查询结果的 System.Data.DataTable。</returns> public static DataTable ExecuteProcedureDataTable(string storedProcName,params object[] paraValues) { using (sqlConnection connection = new sqlConnection(connectionString)) { sqlCommand command = CreatesqlCommand(storedProcName,connection); try { DeriveParameters(command); AssignParameterValues(command,paraValues); sqlDataAdapter adapter = new sqlDataAdapter(command); DataTable dataTable = new DataTable(); adapter.Fill(dataTable); return dataTable; } catch { throw; } } }
Object[] str = new Object[9]; str[0] = "websites,admin"; //需要用到的表 str[1] = "websites.id"; //主表主键 str[2] = "websites.url......"; //需要得到的字段 str[3] = pageSize + ""; //每页显示条数 str[4] = currentPage - 1; //当前页 str[5] = "admin.id=websites.user_id" + sqlstr; //条件 str[6] = ""; //分组依据 str[7] = "websites.id desc"; //排序 str[8] = "0"; DataTable dt = DbHelper.ExecuteProcedureDataTable("SP_PagingLarge",str);
2013年1月16日补充:
using (sqlConnection sqlConn = new sqlConnection(ConnectionString)) { sqlCommand sqlComm = new sqlCommand("SP_PagingLarge",sqlConn); sqlComm.CommandType = CommandType.StoredProcedure; sqlComm.Parameters.Add("@TableNames",sqlDbType.VarChar); sqlComm.Parameters.Add("@PrimaryKey",sqlDbType.VarChar); sqlComm.Parameters.Add("@Fields",sqlDbType.VarChar); sqlComm.Parameters.Add("@PageSize",sqlDbType.Int); sqlComm.Parameters.Add("@CurrentPage",sqlDbType.Int); sqlComm.Parameters.Add("@Filter",sqlDbType.VarChar); sqlComm.Parameters.Add("@Group",sqlDbType.VarChar); sqlComm.Parameters.Add("@Order",sqlDbType.VarChar); sqlComm.Parameters.Add("@RecordCount",sqlDbType.Int); sqlComm.Parameters[0].Value = "tHisRec"; sqlComm.Parameters[1].Value = "RecID"; sqlComm.Parameters[2].Value = "RecID,ConversationID,FromUri,ToUri,FromContactdispName,ToContactdispName,MessageText,SendDT"; sqlComm.Parameters[3].Value = pageSize; sqlComm.Parameters[4].Value = currentIndex - 1; sqlComm.Parameters[5].Value = strWhere; sqlComm.Parameters[6].Value = null; sqlComm.Parameters[7].Value = "RecID desc"; sqlComm.Parameters[8].Direction = ParameterDirection.Output; sqlConn.open(); sqlDataAdapter adapter = new sqlDataAdapter(sqlComm); DataTable dt = new DataTable(); adapter.Fill(dt); ..... countMessage = Convert.ToInt32(sqlComm.Parameters["@RecordCount"].Value);//记录总数 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。