بازيابی N ركورد جديد با استفاده از يك query

در زمان پياده سازی برنامه های وب ، ممکن است به مواردی برخورد نمائيم که می بايست به تعداد مشخصی از جديدترين رکوردهای درج شده در يك بانک اطلاعاتی دستيابی و آنان را بر روی يک صفحه وب نمايش دهيم. مثلا" يک وب سايت خبری ممکن است دارای يک جدول بانک اطلاعاتی باشد ( مثلا" NewsStoriesTable ) که برای هر خبری که تعر يف می گردد يک رکورد را در جدول مربوطه اضافه می نمايد . در صورتی که بخواهيم صرفا" ده خبر جديد موجود در بانک اطلاعاتی را
پنجشنبه، 3 بهمن 1387
تخمین زمان مطالعه:
موارد بیشتر برای شما
بازيابی N ركورد جديد با استفاده از يك query
بازيابی N ركورد جديد با استفاده از يك  query
بازيابی N ركورد جديد با استفاده از يك query

در زمان پياده سازی برنامه های وب ، ممکن است به مواردی برخورد نمائيم که می بايست به تعداد مشخصی از جديدترين رکوردهای درج شده در يك بانک اطلاعاتی دستيابی و آنان را بر روی يک صفحه وب نمايش دهيم. مثلا" يک وب سايت خبری ممکن است دارای يک جدول بانک اطلاعاتی باشد ( مثلا" NewsStoriesTable ) که برای هر خبری که تعر يف می گردد يک رکورد را در جدول مربوطه اضافه می نمايد . در صورتی که بخواهيم صرفا" ده خبر جديد موجود در بانک اطلاعاتی را بر روی صفحه اصلی سايت منتشر نمائيم ، از چه روش و يا روش هائی می توان استفاده نمود؟ احتمالا" پيشنهاد می نمائيد که از عبارت و يا دستور SELECT به صورت زير استفاده گردد :
SELECT * FROM NewsStoriesTable
روش فوق ، تمامی رکوردهای موجود در جدول NewsStoriesTable را برمی گرداند ( نه صرفا" ده رکورد جديد موجود در بانک ) . در صورتی که بخواهيم صرفا" تعداد مشخصی از رکوردها را استفاده نمائيم ، می بايست با استفاده از منطق برنامه نويسی عمليات فيلترينگ را انجام تا صرفا" N رکورد مورد نظر با عبور از فيلتر ايجاد شده شرايط موجود در برنامه را تامين نمايند.
آيا روش فوق گزينه ای منطقی است ؟ پاسخ به سوال فوق منفی است و برای بازيابی رکوردهای موجود در بانک اطلاعاتی از مکانيزم های قدرتمند و مناسبی استفاده نشده است ، چراکه در ابتدا می بايست تمامی رکوردهای موجود در بانک پس از اجرای query مورد نظر برگردانده شده و در ادامه بر روی صفحه وب منتقل و با توجه به کد نوشته شده ، تعداد مشخصی از آنان را نمايش و يا ساير عمليات دلخواه را بر روی آنان انجام داد . بديهی است به موازات افزايش تعداد رکوردهای موجود در بانک ، کارآئی روش فوق كاهش خواهد يافت .
از ديگر روش های موجود،استفاده از کليد واژه های TOP و ROWCOUNT در ارتباط با سرويس دهنده SQL است . با استفاده از کليد واژه های فوق می توان تعداد رکورد برگردانده شده توسط اجرای يک query را محدود به تعداد مشخصی نمود . بدين ترتيب ، حجم اطلاعات بازيابی شده در اثر اجرای يک query کاهش يافته و امکان مشاهده آنان با صرف زمان مناسب فراهم می گردد .
در ادامه با تمرکز برروی هر يک از کليد واژه های TOP و ROWCOUNT با نحوه استفاده از آنان بيشتر آشنا می شويم .

اعمال محدوديت در بازيابي ركوردها با استفاده از TOP

کليد واژه TOP در SQL SERVER 7.0 معرفی و هدف آن ارائه روشی به منظور اعمال محدوديت در بازيابی نتايج حاصل از اجرای يك SELECT query می باشد . با استفاده از TOP می توان N ركورد جديد موجود در بانك را و يا X درصد از ركوردهای جديد را بازيابی نمود . گرامر استفاده از TOP به صورت زير است :

SELECT TOP N select list
FROM TableName
 
'Example :
SELECT TOP 5  *
FROM authors

الگوی دوم

SELECT TOP X PERCENT select list
FROM TableName
'Example :
SELECT TOP 25 PERCENT au_lname, au_fname
FROM authors
WHERE zip = '92101'


در كد فوق ، N و X می بايست دارای مقادير صحيح مثبت باشند و در صورتی كه از الگوی دوم استفاده می گردد ، X می بايست دارای مقداری بين صفر تا يكصد باشد .
استفاده از TOP ، باعث دستيابی به N ركورد جديد و يا X درصد از ركوردهای جديد موجود در بانك اطلاعاتی می گردد . معمولا" چنين درخواست هائی به همراه ORDER BY استفاده می گردد . مثلا" برای برگرداندن ده ركورد و يا خبر جديد ، می بايست از ORDER BY نبز به منظور مرتب سازی آنان بر اساس تاريخ درج در بانك اطلاعاتی ( PublicationDate ) استفاده گردد . كد زير نحوه انجام ابن كار را نشان مي دهد :

 SELECT TOP 10 NewsURL, ArticleTitle, ArticleAuthor FROM NewsStoriesTable
ORDER BY PublicationDate DESC


اعمال محدوديت در بازيابی ركوردها با استفاده از ROWCOUNT

قبل از SQL SERVER 7.0 ، تنها روش موجود برای اعمال محدوديت در بازيابی ركوردهائی که در اثر اجرای يك query برگردانده می شوند ، استفاده از متغير ROWCOUNT بود که در ابتدا و قبل از اجرای هر گونه query می بايست به آن يک مقدار عددی بزرگتر از صفر نسبت داده شود :
SET ROWCOUNT N
پس از مقداردهی متغير ROWCOUNT ، تمامی عبارات زيرمجموعه SQL موجود در حوزه ، صرفا" قادر به پردازش N رکورد خواهند بود . اکثر نسخه های جديد سرويس دهنده SQL همچنان امکان استفاده از ROWCOUNT را حمايت می نمايند . بخاطر داشته باشيد که مقدار نسبت داده شده به متغير ROWCOUNT صرفا" در ارتباط با دستور SELECT اعمال نخواهد شد و دستورات و يا عبارات ديگری نظير INSERT , UPDATE و DELETE را نيز شامل می شود . كد زير نحوه استفاده از ROWCOUNT به منظور بازيابی ده ركورد جديد موجود در جدول NewsStoriesTable را نشان می دهد :

SET ROWCOUNT 10
SELECT NewsURL, ArticleTitle, ArticleAuthor
FROM NewsStoriesTable
ORDER BY PublicationDate DESC


در صورتی كه از SQL SERVER 6.5 و نسخه های قبل از آن استفاده می گردد ، مجبور به استفاده از ROWCOUNT خواهيم بود چراكه در نسخه های فوق TOP معرفی نشده و امكان استفاده از آن وجود نخواهد داشت . به منظور استفاده از TOP می بايست حداقل از نسخه SQL Server 7.0 استفاده گردد .
در صورتی كه از يك عبارت SELECT استفاده می گردد و دقيقا" مشخص است كه چه تعداد ركورد را می بايست بازيابی نمود ، پيشنهاد می گردد كه از TOP استفاده گردد . TOP به منظور كار با عبارت SELECT طراحی شده است و دارای اثرات جانبی ROWCOUNT نمی باشد ( استفاده از آن در ارتباط با عباراتی به غير از SELECT و تاثير بر روی triggers ) .
برای عبارات ساده SELECT دليل خاصی برای استفاده از ROWCOUNT وجود ندارد ولی اگر قصد فراخوانی يك Stored procedure را داريد كه يك SELECT را انجام می دهد و عبارات ديگری را نيز پردازش می نمايد ، در زمان استفاده از ROWCOUNT می بايست اين اطمينان حاصل گردد كه مقدار نسبت داده شده به ROWCOUNT صرفا" در ارتباط با query مورد نطر بكارگرفته می شود .
در اين رابطه يك حالت خاص وجود دارد كه ترجيح داده می شود از ROWCOUNT در يك SELECT query در مقابل TOP استفاده گردد : زمانی كه قصد داريد به پياده كننده صفحه وب اجازه دهيد كه تعداد نتايج برگردانده شده اجرای يك query را مشخص نمايند . مثلا" فرض كنيد دارای يك Stored procedure با نام getRecentArticles باشيم كه يك پارامتر عددی صحيح را با نام ResultCount @ از ورودی می گيرد . در چنين مواردی Stored procedure می بايست صرفا" به تعداد ResultCount @ ركورد جديد موجود در بانك را برگرداند( نه اين كه همواره ده ركورد را برگرداند ) . بدين ترتيب به پياده كندگان صفحات وب اجازه داده می شود كه مشخص نمايند كه به چه تعداد ركورد جديد موجود در بانك می توانند دستيابی داشته باشند . كد زير نحوه انجام اين كار را نشان می دهد :

CREATE PROCEDURE getRecentArticles
(
@ResultCount int
)
AS
نوشتن queryمورد نظر برای برگرداندن ResultCount@ ركورد

موارد استفاده از TOP و ROWCOUNT

در صورتی كه از يك query پويا در stored procedure استفاده گردد ،‌ می توان از TOP نيز استفاده نمود . روش استفاده از TOP در كد زير صحيح نمی باشد و در مقابل ، می بايست به صورت پويا يك query را ايجاد و در ادامه با استفاده از EXEC و يا sp_executesql آن را اجراء نمود.

 

CREATE PROCEDURE getRecentArticles
(
  @ResultCount int
)
AS

SELECT TOP @ResultCount NewsURL, ArticleTitle, ArticleAuthor
FROM NewsStoriesTable
ORDER BY PublicationDate DESC


كد زير نحوه استفاده از ROWCOUNT در يك Stored Procedure و متناسب با پارامتر ورودی را نشان می دهد :

CREATE PROCEDURE getRecentArticles
(
@ResultCount int
)
AS

SET ROWCOUNT @ResultCount

SELECT NewsURL, ArticleTitle, ArticleAuthor
FROM NewsStoriesTable
ORDER BY PublicationDate DESC


در صورتی كه قصد اعمال محدوديت در بازيابی ركوردهای حاصل از اجرای دستورات INSERT ,UPDATE و يا DELETE را داشته باشيد ، می بايست از ROWCOUNT استفاده گردد ،‌ چراكه TOP صرفا" در ارتباط با عبارت SELECT بكار گرفته می شود.

جمع بندی

در اين مقاله ، با طرح اين پرسش كه نحوه بازيابی n ركورد جديد در يك بانك اطلاعاتی با استفاده از يك query به چه صورت است ، دو كليد واژه TOP و ROWCOUNT معرفی گرديدند . پس از آشنائی با گرامر هر يك از كليد واژه های فوق ،‌ آنان را با يكديگر مقايسه و در نهايت با جايگاه استفاده هر يك از آنان آشنا شديم .
منبع: http://www.4guysfromrolla.com




نظرات کاربران
ارسال نظر
با تشکر، نظر شما پس از بررسی و تایید در سایت قرار خواهد گرفت.
متاسفانه در برقراری ارتباط خطایی رخ داده. لطفاً دوباره تلاش کنید.
مقالات مرتبط