PDA

View Full Version : بازیابی محدوده ای از اطلاعات از SQLServer



msakbari
سه شنبه 09 خرداد 1385, 00:20 صبح
من یه Table دارم که تعداد حدود 1.000.000 رکورد درون اون هستش .
مسئله اینه که می خواهم هر بار 100 تا از این ها رو بردارم و نشون کاربر بدم و باید حتما
صفحه بندی هم بکنم . می دونید که DataSet این کار رو می کنه ولی برای این کار اصلا مناسب
نیست .

البته بیشتر بدنبال این هستم که با خود SqlServer یجوری این کار رو بکنم . البته Sql با استفاده
از Top می تونهاین کار را تاحدی پشتیبانی کنه ولی بازهم برای این کار زیاد جالب نیست . و
باید یه جوری محدوده ای از رکوردها را انتخاب کرد .مثلا روردهای 100-200


اگر میشه راهنمایی فرمایید ؟

ali_sorouri2005
سه شنبه 09 خرداد 1385, 00:50 صبح
سلام دوست عزیز
شما میتونی یه فیلد به نام id بزاری که شماره بده به هر رکوردبعد بگی که بیا رکوردهایی رو نشون بده که id اونها بین 100 تا 200 باشه
نمیدونم منظورت اینه یا چیزه دیگه؟اگه نیست که بیشتر توضیح بده
موفق باشی

msakbari
سه شنبه 09 خرداد 1385, 13:21 عصر
مرسی Ali جان
ولی این کاری که شما میگی هم مشکل داره . در واقع ممکنه یه رکوردهایی Delete بشه و بعدا ترتیب شماره ها نیز بهم می خوره .

دنبال راه کار دیگری باید گشت .

این مسئله خیلی مهمه ؟

سید مسعود موحد
سه شنبه 09 خرداد 1385, 14:42 عصر
این فیلد را شما باید در query تون ایجاد کنید بعد از آن Query دوباره Query بگیرید یا میتوانید از SQL2005 استفاده کنی که این کارو برات انجام میده

msakbari
سه شنبه 09 خرداد 1385, 19:27 عصر
جناب سید مسعود موحد

اگه ممکنه برای هر دو موردی که ذکر کردید مثال کوتاهی بیاورید ؟
مرسی ؟

ali_sorouri2005
سه شنبه 09 خرداد 1385, 21:34 عصر
سلام
خوب می دونم ولی اون مشکل هم حل شدنی هستش کافی بگی وقتی رکوردی حذف میشه
id تمام رکورد های بهد از اون یکی کم بشه و همینطور موقع اضافه کردن هم یه راه حل داره
موفق باشی

msakbari
چهارشنبه 10 خرداد 1385, 10:15 صبح
علی جون آخه این کار که نمیشه
تو باید واسه یه Delete مثلا 500000 تا رکورد رو Update کنی . می دونی یعنی چه ؟ یه سرور Sql می میره تا کارتو رو راه بندازه ؟

مرسی

ali_sorouri2005
چهارشنبه 10 خرداد 1385, 18:57 عصر
سلام
درسته حق با شماست ولی خوب راه دیگش رو دوستان اگر بگن خوبه؟فعلا که کسی جوابی
نداده امیدوارم راه درستشو یه نفر بگه ؟

white fox
پنج شنبه 11 خرداد 1385, 01:26 صبح
اصلا مسئله ای نیستش اینا که....
لازم نیست اون ستونی ID رو دائمی وارد کنید...
کافیه موقعی که میخوایند اطلاعاتو بخونید این ستون رو اضافه کنید ..چون در لحظه هستش هر چی رکورد هم پاک شده باشه مشکلی نیست و بر اساس رکوردهای جاری شماره میزاره و بر میگردونه..
به کد زیر دقت کنید:


Create Procedure dbo.sqlj_GetClientsByPage

-- Declare parameters.
@CurrentPage As tinyint,
@PageSize As tinyint,
@TotalRecords As int OUTPUT


As

-- Turn off count return.
Set NoCount On

-- Declare variables.
Declare @FirstRec int
Declare @LastRec int

-- Initialize variables.
Set @FirstRec = (@CurrentPage - 1) * @PageSize
Set @LastRec = (@CurrentPage * @PageSize + 1)

-- Create a temp table to hold the current page of data
-- Add an ID column to count the records
Create Table #TempTable
(
ClientId int IDENTITY PRIMARY KEY,
Name varchar(50),
Balance smallmoney
)

--Fill the temp table with the reminders
Insert Into #TempTable
(
Name,
Balance
)
Select
Name As Name,
Balance As Balance
From
Clients
Order By
Name

--Select one page of data based on the record numbers above
Select
ClientId,
Name,
Balance
From
#TempTable As Clients
Where
ClientId > @FirstRec
And ClientId < @LastRec

--Return the total number of records available as an output parameter
Select
@TotalRecords = Count(*)
From
Clients


را دیگه که شبیه همین راه هست استفاده از Table Variable هست...
فکر کنم کد گویا باشه

ali_sorouri2005
پنج شنبه 11 خرداد 1385, 02:48 صبح
سلام
دقیقا درسته کاری که white fox میگه دستت درد نکنه
موفق باشی

msakbari
پنج شنبه 11 خرداد 1385, 07:44 صبح
WhiteFOX جان واقعا مرسی
فوق العاده است .

دوستان من پس از بررسی زیاد این مسئله به این نتیجه رسیدم که برای این کار باید از
Cursor ها استفاده کرد من پروسیجر اون رو هم نوشتم اگر کسی خواست بگه تا بزارم .

در ضمن روش جناب WhiteFOX هم زیاد بد نبود ولی برای 1000000 رکورد کار اصلا خوبی نیست
چون تمام آنها باید کاملا Insert بشوند که این کار وحشتناک خواهد بود .


موفق باشید .