ROW_NUMBER()
का उपयोग करें और एक स्थिर उपयोगिता फ़ंक्शन (मेरे कोड में GetPaginatedSQL
के रूप में) लागू करें, जो स्वचालित रूप से आपके मूल SQL क्वेरी को सीमित/पृष्ठबद्ध में लपेटता है।
यह एक मैं का उपयोग करें:
namespace Persistence.Utils
{
public class SQLUtils
{
/// <summary>
/// Builds a paginated/limited query from a SELECT SQL.
/// </summary>
/// <param name="startRow">Start row</param>
/// <param name="numberOfRows">Number/quatity of rows to be expected</param>
/// <param name="sql">Original SQL (without its ordering clause)</param>
/// <param name="orderingClause">MANDATORY: ordering clause (including ORDER BY keywords)</param>
/// <returns>Paginated SQL ready to be executed.</returns>
/// <remarks>SELECT keyword of original SQL must be placed exactly at the beginning of the SQL.</remarks>
public static string GetPaginatedSQL(int startRow, int numberOfRows, string sql, string orderingClause)
{
// Ordering clause is mandatory!
if (String.IsNullOrEmpty(orderingClause))
throw new ArgumentNullException("orderingClause");
// numberOfRows here is checked of disable building paginated/limited query
// in case is not greater than 0. In this case we simply return the
// query with its ordering clause appended to it.
// If ordering is not spe
if (numberOfRows <= 0)
{
return String.Format("{0} {1}", sql, orderingClause);
}
// Extract the SELECT from the beginning.
String partialSQL = sql.Remove(0, "SELECT ".Length);
// Build the limited query...
return String.Format(
"SELECT * FROM (SELECT ROW_NUMBER() OVER ({0}) AS rn, {1}) AS SUB WHERE rn > {2} AND rn <= {3}",
orderingClause,
partialSQL,
startRow.ToString(),
(startRow + numberOfRows).ToString()
);
}
}
}
समारोह ऊपर सुधार किया जा सकता है, लेकिन एक प्रारंभिक कार्यान्वयन है।
फिर, अपने DAOs में, आप बस कुछ इस तरह कर रही किया जाना चाहिए:
using (var conn = new SqlConnection(CONNECTION_STRING))
{
using (var cmd = conn.CreateCommand())
{
String SQL = "SELECT * FROM MILLIONS_RECORDS_TABLE";
String SQLOrderBy = "ORDER BY DATE ASC "; //GetOrderByClause(Object someInputParams);
String limitedSQL = GetPaginatedSQL(0, 50, SQL, SQLOrderBy);
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter();
cmd.CommandText = limitedSQL;
// Add named parameters here to the command if needed...
adapter.SelectCommand = cmd;
adapter.Fill(ds);
// Process the dataset...
}
conn.Close();
}
आशा है कि यह मदद करता है।
स्रोत
2013-01-17 14:35:31
यह http://blog.sqlauthority.com/2010/12/15/sql-server-server-side-paging-in-sql-server-2011-a-better-alternative/ –
बस इसे पढ़ें: http://www.asp.net/web-forms/tutorials/data-access/paging-and-sorting/efficiently-paging-through-large-amounts-of-data-vb यह एक बहुत ही पूर्ण ट्यूटोरियल है (VB.NET लेकिन इससे इस मामले में कोई फर्क नहीं पड़ता)। –
@ गुइलहेम आप वास्तव में * एसक्यूएल-सर्वर -2000 का उपयोग कर रहे हैं? (टैग) यदि हां, तो यह आपके विकल्पों को काफी सीमित कर देगा। –