بازيابی 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


تبلیغات در راسخون
نظرات کاربران
ارسال نظر
با تشکر، نظر شما پس از بررسی و تایید در سایت قرار خواهد گرفت.
متاسفانه در برقراری ارتباط خطایی رخ داده. لطفاً دوباره تلاش کنید.
موارد بیشتر برای شما
نجوای شبانه حیدر: مرثیه‌ای در سوگ یاس نبوی
نجوای شبانه حیدر: مرثیه‌ای در سوگ یاس نبوی
شایعات نگران‌کننده درباره حمله هسته‌ای از کجا نشئت می‌گیرد؟
play_arrow
شایعات نگران‌کننده درباره حمله هسته‌ای از کجا نشئت می‌گیرد؟
لحظاتی از تحقیر نتانیاهو به دست مردان ایران ‌زمین!
play_arrow
لحظاتی از تحقیر نتانیاهو به دست مردان ایران ‌زمین!
تصاویری از سوختن دو فروند نفتکش متخلف در تنگه هرمز
play_arrow
تصاویری از سوختن دو فروند نفتکش متخلف در تنگه هرمز
داستان موشک، در بازدید فرمانده
play_arrow
داستان موشک، در بازدید فرمانده
آیا داشتن خانه و خودرو باعث حذف کالابرگ می‌شود؟
play_arrow
آیا داشتن خانه و خودرو باعث حذف کالابرگ می‌شود؟
۴ شرط تعطیلی مدارس به روایت سخنگوی دولت
play_arrow
۴ شرط تعطیلی مدارس به روایت سخنگوی دولت
مراسم بدرقه مرحوم کوروش زارعی در حوزه هنری
play_arrow
مراسم بدرقه مرحوم کوروش زارعی در حوزه هنری
تصاویر قبل و بعد از انهدام سامانه‌های ناوبری دشمن در تنگه هرمز
play_arrow
تصاویر قبل و بعد از انهدام سامانه‌های ناوبری دشمن در تنگه هرمز
آیا قیمت بنزین تغییر می‌کند؟
play_arrow
آیا قیمت بنزین تغییر می‌کند؟
صوت کامل روضه‌خوانی عباس حیدرزاده در اولین شب مراسم عزاداری ایام شهادت حضرت فاطمةالزهرا سلام‌الله‌علیها از طرف رهبر معظم انقلاب در زینبیه
music_note
صوت کامل روضه‌خوانی عباس حیدرزاده در اولین شب مراسم عزاداری ایام شهادت حضرت فاطمةالزهرا سلام‌الله‌علیها از طرف رهبر معظم انقلاب در زینبیه
صوت کامل سخنرانی حجت‌الاسلام والمسلمین مهدی اصلانی در اولین شب مراسم عزاداری ایام شهادت حضرت فاطمةالزهرا سلام‌الله‌علیها از طرف رهبر معظم انقلاب در زینبیه
music_note
صوت کامل سخنرانی حجت‌الاسلام والمسلمین مهدی اصلانی در اولین شب مراسم عزاداری ایام شهادت حضرت فاطمةالزهرا سلام‌الله‌علیها از طرف رهبر معظم انقلاب در زینبیه
صوت کامل روضه‌خوانی حاج منصور ارضی در اولین شب مراسم عزاداری ایام شهادت حضرت فاطمةالزهرا سلام‌الله‌علیها از طرف رهبر معظم انقلاب در زینبیه
music_note
صوت کامل روضه‌خوانی حاج منصور ارضی در اولین شب مراسم عزاداری ایام شهادت حضرت فاطمةالزهرا سلام‌الله‌علیها از طرف رهبر معظم انقلاب در زینبیه
انهدام تجهیزات نظامی مزدوران سعودی در «الجوف» یمن
play_arrow
انهدام تجهیزات نظامی مزدوران سعودی در «الجوف» یمن
مسیر شهادت حضرت فاطمه زهرا (س)؛ از سقیفه تا شهادت
مسیر شهادت حضرت فاطمه زهرا (س)؛ از سقیفه تا شهادت