Sunday, September 14, 2008

ROW_NUMBER

+آپدیت: این هفته سه‌شنبه سایت A آزاد نیست. فعلن این هفته کلاس طبق روال قبلی روزهای 5شنبه و جمعه تشکیل می‌شه. خواهش می‌کنم مطالب جلسات قبل رو مطالعه کنید و در این دو جلسه غیبت نکنید٬ چون مبحث خیلی مهم Index ها رو شروع می‌کنیم.



+خب اول توضیح بدم که من تصمیم گرفتم تو این وب‌لاگ به جای نگارش رسمی از شکسته‌نویسی(نوشتن محاوره‌ای) استفاده کنم. کارم دو دلیل داشت. یکی این‌که بیش‌تر از 4 ساله که جای دیگه‌ای شکسته می‌نویسم و خب این ترک عادت موجب عارضه‌ی کم نوشتن شده بود. دوم این‌که روی نوشته‌هایی که با نگارش رسمی می‌نویسم خیلی وسواسم زیاده که پر از کلمات بزرگ چندین بخشی نشه و در ضمن غلط نداشته باشه و از نظر نگارشی روون باشه که با شیوه‌ی محاوره‌ای این مشکلات وجود نداره. ضمن این‌که تجربه‌ی کوتاهی که از نوشتن وب‌لاگ با موضوع فنی داشتم این بوده که این‌طوری٬ رابطه دوطرفه من و مخاطب ساده‌تر برقرار می‌شه(این شد دلیل سوم :) ). در نتیجه از این به بعد اوضاع بر این منواله.



+نکته دیگه این‌که تونستم Windows Live Writer رو به صورت Portable رو فلش‌دیسکم نصب کنم. در نتیجه می‌تونم روی لپ‌تاپم(که معمولن با اون کار می‌کنم) بنویسم و نتیجه رو روی PC(که به اینترنت وصله) پابلیش کنم. تا 3-2 روز دیگه هم یه Wireless Adapter می‌گیرم که لپ‌تاپ رو با PC شبکه کنم و بتونم از ADSL روی لپ‌تاپ هم استفاده کنم.



+سر کلاس گفتم که چند مطلب ویرایش نشده دارم که به تدریج پست می‌کنم. مطلب این پست جزو اون‌ها نیست. یکی از دوستان دیروز تعدادی از script های دیتابیسش رو داده بود که من یه نگاهی به‌شون بندازم. توی چند تا از stored procedure ها لازم بوده که تو دستور select ٬ شماره سطر رو هم برگردونه. از روشی استفاده کرده بود که ظاهرن آقای بنایی پیشنهاد کرده بوده(لینکش رو برام فرستاد). من خودم با این روش موافق نیستم چون اورهد پردازش زیادی داره(مربوط می‌شه به table scan‌ ها که این‌جا بحثش رو باز نمی‌کنم چون خیلی مفصله. اواخر دوره توضیح مختصری راجع‌ به‌شون می‌دم٬ بحث مفصلش می‌مونه برای دوره administration-اگر تشکیل بشه البته).



اما راه حل من. من قبلن به این شکل عمل می‌کردم:



 




SELECT [row_number]=IDENTITY(int,1,1), * 
INTO #testtbl
FROM sys.objects

SELECT * FROM #testtbl



 
GO



همون‌طور که می‌بینید من یه متغیر از نوع identity قبل از * اضافه کردم که به ازای هر سطر یکی به مقدارش اضافه می‌شه. اما چون این روش فقط با دستور SELECT INTO قابل انجامه٬ من یه جدول temporary درست کردم و نتیجه رو توی اون ریختم. درباره جدول‌های temporary و دستور SELECT INTO لطفن به "فصل 5 درس 3" و "فصل 3 درس 1" یه نگاهی بندازید٬ جلسه آینده هر دو مورد رو توضیح می‌دم.



نتیجه اجرای اسکریپت بالا:








اما همراه SQL Server 2005 ٬ تابع ROW_NUMBER معرفی شد که کار رو راحت‌تر کرده. به اسکریپت بعدی توجه کنید:






SELECT ROW_NUMBER() OVER(ORDER BY [object_id]) AS [row_number],* 
FROM sys.objects

GO



سینتکس تابع به صورت (ROW_NUMBER() OVER(ORDER BY column_name  هست که نیاز به توضیح بیش‌تر نداره. خروجی این دستور هم دقیقن مثل دستور قبلیه.



 



+پ.ن: اگر لازم باشه سطرهای خاصی رو انتخاب کنیم(مثلن سطرهای 100 تا 110) یک راه٬ استفاده از این سینتکس هست:



 




WITH [tbl_Numbered_Rows] AS 
(SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) AS [row_number] ,*
FROM sys.objects)
SELECT * FROM tbl_Numbered_Rows
WHERE [row_number] BETWEEN 100 AND 110

GO




+پ.ن: اگر سوالی دارید لطفن کامنت بذارید.

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home