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

صفحه اصلی کارگروهها >> طراحی و برنامه نویسی SQL Server  >> بازیابی N رکورد جدید با استفاده از یک query
Freddie mercury

Freddie mercury

در کارگروه: طراحی و برنامه نویسی SQL Server
تعداد ارسالي: 2
19 سال پیش در تاریخ: یکشنبه, اسفند 21, 1384 3:38


در زمان پیاده سازی برنامه های وب ، ممکن است به مواردی برخورد نمائیم که می بایست به تعداد مشخصی از جدیدترین رکوردهای درج شده در یک بانک اطلاعاتی دستیابی و  آنان را بر روی یک صفحه وب نمایش دهیم. مثلا" یک وب سایت خبری ممکن است دارای یک جدول بانک اطلاعاتی باشد ( مثلا"  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


موارد استفاده از  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/




03.gif

حذف ارسالي ويرايش ارسالي