PDA

View Full Version : query limit MsSql



delphi77
پنج شنبه 13 اسفند 1383, 08:58 صبح
درود بر همه شما جویندگان دانش
از توجه شما نسبت به این موضوع سپاس گزارم
در mysql دستوری دیدم که query را از بالا و پایین محدود می کند یعنی اگر query دارای 100 تا رکورد باشد می توان با این دستور 20تای اول و به همین شکل 20 تای بعدی را بعنوان جواب برگرداند.

این دستور مشابهی در mssql دارد؟
------------------------------------------------------------------------------------------------
من تاج نمی خواهم من تخت نمی خواهم
در خدمتت افتادن بر روی زمین خواهم

M.GhanaatPisheh
پنج شنبه 13 اسفند 1383, 13:16 عصر
Top
select top 20 * from Orders
ولی Top n تعداد n رکورد از جدول رو بر می گردونه.

می تونید برای این کار Cursor استفاده کنیn(اینو احتمالا بلدید)

اما یه راه دیگه استفاده از Indexing هست.

delphi77
پنج شنبه 13 اسفند 1383, 16:23 عصر
لطفا بیشتر توضیح بدهید
هم در مورد Cursor و هم Indexing ::نوشتن::

delphi77
پنج شنبه 13 اسفند 1383, 16:49 عصر
من نمی دانم که چطور می شود یک cersor را تنظیم کرد :گیج:

AminSobati
دوشنبه 24 اسفند 1383, 12:36 عصر
دوست عزیزم،
الزاما به Cursor نیازی ندارید(برای هدف شما). مثلا این روش هم بهتون کمک میکنه که 10 تا 10 تا از جدول Products در Northwind اطلاعات بگیرین:

declare @id int
set @id=0

select top 10 * from products where productid>@id order by productid
select top 10 @id=productid from products where productid>@id order by productid

select top 10 * from products where productid>@id order by productid
select top 10 @id=productid from products where productid>@id order by productid
که دو سطر آخر رو میتونین مرتب تکرار کنین (مثلا با Call کردن یک SP)

delphi77
دوشنبه 24 اسفند 1383, 18:24 عصر
من نمی خوام stored precedur بنویسم من می خوام با یک query ساده این کار را بکنم

AminSobati
دوشنبه 24 اسفند 1383, 18:56 عصر
هر Query یک جواب داره. پس اگر شما چند Result نیاز دارین، میبایست بیش از یک Query داشته باشین.
مگر اینکه کل جدول رو در یک Recordset مثلا ببرین و خودتون 10 تا 10 تا ازش نمایش بدین(بد ترین راه ممکن!!)

delphi77
سه شنبه 25 اسفند 1383, 14:41 عصر
M.GhanaatPisheh گفته:

می تونید برای این کار Cursor استفاده کنیn(اینو احتمالا بلدید)
اگر کسی می داند که چگونه می توان با cursor این کار را کرد لطف کنه راهنمایی کنه

titbasoft
سه شنبه 25 اسفند 1383, 17:10 عصر
اگر کسی می داند که چگونه می توان با cursor این کار را کرد لطف کنه راهنمایی کنه
این روش خیلی خیلی مشکل تر از استفاده از store procedure است. فقط همین بس که هر بار fetch کردن یک result set جدید برمیگردونه. البته این چیزیه که من می دونم. شاید هم اشتباه کنم. :flower:

اما چون کدش رو خواسته بودین اون رو می نویسم:

declare @rc int --row counter
declare @from int,@count int
declare c scroll cursor for
select * from testTable

set @rc=1
set @from=1
set @count=5

open c
fetch absolute @from from c
while (@@fetch_status=0) and (@rc!=@count)
begin
set @rc = @rc + 1
fetch relative 1 from c
end
close c
deallocate c
:wink:

delphi77
دوشنبه 15 فروردین 1384, 17:01 عصر
اما چون کدش رو خواسته بودین اون رو می نویسم
ولی این کد را باید کجا نوشت :گیج:
آیا باید یک stored precedur نوشت :گیج:

titbasoft
دوشنبه 15 فروردین 1384, 17:42 عصر
آیا باید یک stored precedur نوشت
الزاما خیر ، می تونید اون رو توی یک commandText هم بسازید
این لینک شاید براتون مفید باشه :flower:
http://www.barnamenevis.org/forum/viewtopic.php?t=22699

AminSobati
دوشنبه 15 فروردین 1384, 23:48 عصر
اگر کسی می داند که چگونه می توان با cursor این کار را کرد لطف کنه راهنمایی کنه

من نمی خوام stored precedur بنویسم من می خوام با یک query ساده این کار را بکنم

آیا باید یک stored precedur نوشت
دوست عزیز چه مشکلی با SP دارین؟!!
اگر با Cursor این کار رو انجام بدین، حالتی رو در نظر بگیرید که تعداد زیادی رکورد داشته باشین. Cursor میبایست همه رکوردها رو در حافظه بارگزاری کنه و اگر این کار توسط چندین کاربر مرتبا انجام بشه، مطمئنا تاثیر منفی در Performance سرور خواهد داشت.
ولی با استفاده از SP این کار بصورت بهینه و منطقی انجام خواهد شد. یا جداقل میتونین Query ساده ای که براتون نوشته بودم رو در یک Loop قرار بدین تا همه رکوردها 10 تا 10 تا بدست بیان.
موفق باشید