PDA

View Full Version : کمک در مورد نوشتن کرسر برای بیرون کشیدن برخی از رکوردها



Mojmos
دوشنبه 24 فروردین 1388, 15:37 عصر
سلام
من دارم يه سايت طراحي ميکنم و مي خوام اطلاعات ديتابيس رو به صورت صفحه بندي شده به کاربر ارائه بدم (مثل گوگل که نتايج جستجو رو صفحه بندي ميکنه) براي اينکه سطرهاي مورد نياز رو از ديتابيس بيرون بکشم تا توي يک صفحه نشون بدم (مثلا در هر صفحه 10 رکورد) از کرسر به صورت زير استفاده کردم:


-------------------------------------------------------------------------------------
ALTER PROCEDURE dbo.BrouseProducts
(
@low int,
@high int
)

AS

DECLARE @counter int,@a int
DECLARE BrouseProductsCursor CURSOR SCROLL FOR
select Productid, ProductName, ProductDescription, UnitPrice, unitsAvilable, companyName from products join suppliers on products.SupplierID = suppliers.SupplierID
OPEN BrouseProductsCursor
SET @counter=@low
WHILE @counter <= @high
BEGIN
FETCH ABSOLUTE @counter FROM BrouseProductsCursor
SET @counter = @counter+1
END
CLOSE BrouseProductsCursor
DEALLOCATE BrouseProductsCursor
-----------------------------------------------------------------------------------------------------------------------------
حالا اگه مثلا رکوردهاي 20 تا 30 رو بخوام اين دستور رو ميدم:


exec BrouseProducts 20 , 30


مشکل اينه که اين کرسر 10 تا رکورد را توي ده تا جدول جدا بر ميگردونه و زبان ميزبان(HL) فقط يکي از اونها رو ميگيره
يعني هر دستور FETCH يک رکورد در يک جدول برميگردونه مثلا براي مثالا بالا 10 تا جدول برميگردونه. درحالي که من ميخوام همه رکوردها در يک جدول واحد برگردند

بايد چه کار کنم تا : همه رکوردها در يک جدول واحد برگردند

ممنون از همه ببخشيد که خيلي حرف زدم

رضا عربلو
دوشنبه 24 فروردین 1388, 19:50 عصر
1- تکنیک های بهتری برای paging و جود دارد که در همین انجمن درباره انها صحبت شده است. بهتر است یک جستجو انجام دهید.
2- برای رفع مشکل شما می توانید داده هایتان را در یک جدول موقتی ذخیره کنید و آن جدول را به عنوان خروجی بفرستید.

Mojmos
سه شنبه 25 فروردین 1388, 00:21 صبح
- برای رفع مشکل شما می توانید داده هایتان را در یک جدول موقتی ذخیره کنید و آن جدول را به عنوان خروجی بفرستید.

یعنی راهی نیست که همه رو توی یه جدول برگردونه

niloofar norouzi
پنج شنبه 27 فروردین 1388, 11:30 صبح
بهتر نيست از ranking استفاده بشه؟

Mojmos
پنج شنبه 27 فروردین 1388, 13:57 عصر
بهتر نيست از ranking استفاده بشه؟
ranking دیگه چیه؟؟

من از Auto Increment Primary Key در یه جدول موقت استفاده کردم مشکل حل شد به صورت زیر:


ALTER PROCEDURE dbo.search

(
@PageNumber int,
@PageSize int
)

AS

CREATE TABLE #temp (AutoIncPriKey int IDENTITY(1,1), prID int)
INSERT INTO #temp (prID) SELECT productid FROM products ORDER BY productid

SELECT Productid, ProductName, ProductDescription, UnitPrice, unitsAvilable, companyName,
ImageName FROM #temp join products on #temp.prID=products.productid
join suppliers on products.SupplierID = suppliers.SupplierID
WHERE AutoIncPriKey > (@PageSize * (@PageNumber - 1))
AND AutoIncPriKey <= (@PageSize * (@PageNumber))


RETURN


البته شاید چون به اندازه همه داده ها یه جدول موقت میسازه در دیتابیسهای بزرگ مشکل داشته باشه
اما برا پروژه های کوچک خیلی خوبه