نقل قول: سلکت تاپ پیشرفته
سلام میتونی از این کد استفاده کنی .
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
نقل قول: سلکت تاپ پیشرفته
سلام.
روش پست 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 نیست.
برای جزئیات بیشتر پیشنهاد میکنم اینجا رو ببینید.
نقل قول: سلکت تاپ پیشرفته
جناب صادقیان ممنون از پاسختون
همونطور که میدونید یه مسئله رو به چندین شکل میشه حل کرد میشه به این صورت هم عمل کرد
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS Row ,* FROM @T
)T
WHERE Row >@A+1
نقل قول: سلکت تاپ پیشرفته
بله به این شکل هم میشه حل کرد. ولی از لحاظ Performance روشی که اشاره کردم روش مناسبی هست و Plan صحیحی نیز برای اون ایجاد میشه و اگر از ایندکس مناسبی نیز استفاده کنید میتونه در سرعت ، کمک خیلی زیادی بهتون بکنه.
برای اینکه دقیقتر ببینید چه کاری دارید انجام میدین میتونید هر دو دستور رو بنویسید و در Session مربوطه دستور Set statistics io on رو اجرا کنید و وضعیت هر دو دستور رو بسنجید.
نقل قول: سلکت تاپ پیشرفته
حق باشماست .
اصلا حواسم به Plan نبود بیشتر رو حل کویری به روشهای مختلف فکر میکرم:چشمک: