در زمان پياده سازی برنامه های وب ، ممکن است به مواردی برخورد نمائيم که می بايست به تعداد مشخصی از جديدترين رکوردهای درج شده در يك بانک اطلاعاتی دستيابی و آنان را بر روی يک صفحه وب نمايش دهيم. مثلا" يک وب سايت خبری ممکن است دارای يک جدول بانک اطلاعاتی باشد ( مثلا" 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 می بايست به آن يک مقدار عددی بزرگتر از صفر نسبت داده شود :
پس از مقداردهی متغير 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 |
موارد استفاده از TOP و ROWCOUNT در صورتی كه از 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 @ ركورد
|
در صورتی كه از يك 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 معرفی گرديدند . پس از آشنائی با گرامر هر يك از كليد واژه های فوق ، آنان را با يكديگر مقايسه و در نهايت با جايگاه استفاده هر يك از آنان آشنا شديم .
منبع : www.4guysfromrolla.com - www.srco.ir
نوشته شده توسط : علی رضا اسدی
|