PDA

View Full Version : سلکت تاپ پیشرفته



rational unified process
شنبه 11 آبان 1392, 02:47 صبح
سلام
ما توی اس کیو ال دستوری داریم به اسم Select TOP که n تا رکورد اول رو برمیگردونه.
حالا سوالی که پیش میاد اینه که فرض کنید یه دکمه داریم که میخواهیم توی رویداد click اون از رکورد n+1 به بعد رو برگردونه.ایا دستور صریح یا ترکیبی از دستورات هست که بتونیم این کارو انجام بدیم؟

Salah Sanjabian
شنبه 11 آبان 1392, 13:16 عصر
سلام میتونی از این کد استفاده کنی .

DECLARE @T TABLE
(
ID Int IDENTITY(1,1),
NAME nvarchar (100)
)

INSERT INTO @T
( NAME )
VALUES ( N'Salah' ),('Ahmad'),('Mohammad')

DECLARE @A INT
SET @A=1

SELECT * FROM
(
SELECT TOP (@A+1) id,NAME FROM @T ORDER BY id DESC
)T
ORDER BY id asc

حمیدرضاصادقیان
شنبه 11 آبان 1392, 21:50 عصر
سلام.

روش پست 2 هم میتونه روش خوبی باشه.
ولی در نسخه 2012 یک امکان به نام Offset Fetch اضافه شده که میتونید بگید چند تا رکورد بعدی رو برگردونه و از چه رکوردی به بعد نیز برگردانه بشه.
به عنوان مثال :

Select * from sys.sysobjects
Order by Name
Offset 10 rows fetch next 50 rows only;


با این دستور براساس نام مرتب شده و 10 تای اول Skip شده و فقط 50 تای بعد رو نمایش میدهد.
نکته مهم این دستور این هست که حتما باید با دستور Order by ظاهر بشه وگرنه بهتون خطا خواهد داد.

نکته دیگر اینکه این دستور SQL Standard هست و دستور top جز دستورات استاندارد SQL نیست.

برای جزئیات بیشتر پیشنهاد میکنم اینجا (http://technet.microsoft.com/en-us/library/gg699618.aspx) رو ببینید.

Salah Sanjabian
یک شنبه 12 آبان 1392, 17:59 عصر
جناب صادقیان ممنون از پاسختون
همونطور که میدونید یه مسئله رو به چندین شکل میشه حل کرد میشه به این صورت هم عمل کرد


SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS Row ,* FROM @T
)T
WHERE Row >@A+1

حمیدرضاصادقیان
یک شنبه 12 آبان 1392, 19:46 عصر
بله به این شکل هم میشه حل کرد. ولی از لحاظ Performance روشی که اشاره کردم روش مناسبی هست و Plan صحیحی نیز برای اون ایجاد میشه و اگر از ایندکس مناسبی نیز استفاده کنید میتونه در سرعت ، کمک خیلی زیادی بهتون بکنه.
برای اینکه دقیقتر ببینید چه کاری دارید انجام میدین میتونید هر دو دستور رو بنویسید و در Session مربوطه دستور Set statistics io on رو اجرا کنید و وضعیت هر دو دستور رو بسنجید.

Salah Sanjabian
یک شنبه 12 آبان 1392, 19:59 عصر
حق باشماست .
اصلا حواسم به Plan نبود بیشتر رو حل کویری به روشهای مختلف فکر میکرم:چشمک: