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