PDA

View Full Version : سوال: سوال در مورد Cursor



sajjad_kochekian
پنج شنبه 11 شهریور 1389, 20:18 عصر
اگر بخواهم در کرسر رکورد هایی که در ابتدای آن انتخاب می کنیم داخل یک متغیر بریزم و به ازای هر ردیف که انتخاب می شود کاری انجام شود عمل انتساب کجا باید صورت گیرد

declare @PrsID Int
Declare @i TinyInt , @L Real , @A Real,@code int
Set @i = 0 Set @A = 0

Declare TmPCursor Cursor For
Select code From document Where payment> 1
--set @a= code
Open TmPCursor
While 1=1 Begin
Fetch Next From TmPCursor Into @L
If @@Fetch_Status < > 0 Break
Set @i = @i + 1
Set @A= (select code from Document where Code =@i )
select @i
End
Close TmPCursor
Deallocate TmPCursor
If @i < >0 Set @A = @A / @i

select @i
select @code

بهزادصادقی
پنج شنبه 11 شهریور 1389, 23:32 عصر
استفاده از cursor در SQL Server 2005 به بالا کاملا اشتباه است. شما هر کاری را که می خواهی با cursor انجام دهی می توانی خیلی تمیز تر و با عملکردی فوق العاده بالاتر بدون cursor انجام دهی. اگر برای من تشریح کنی دقیقا دنبال چی هستی، کمکتان خواهم کرد آن را بدون cursor انجام دهید.

sajjad_kochekian
شنبه 13 شهریور 1389, 00:19 صبح
من سه جدول دارم.
1- جدول برنامه ها (که چه کاربری به کدام برنامه دسترسی داشته باشه)
2- جدول فرم ها(کدام فرم مربوط به کدام برنامه است)
3- جدول سطح دسترسی کاربران به فرمها(که مشخص می کند کاربر در این فرم تا چه حدی دسترسی دارد)
حالا می خواهم اگر در جدول فرم ها نام یک فرم را اضافه کردم به ازای هر شخصی که در جدول اول به آن برنامه دسترسی دارد یک رکورد به جدول سطح دسترسی فرم ها اضافه شود.

امید وارم خیلی پیچیده نباشه

بهزادصادقی
شنبه 13 شهریور 1389, 00:28 صبح
به نظر خیلی ساده می آید. شما اگر زحمت بکشی و structure جداول خود را اینجا وارد کنی، من query لازم را برایت تشریح می کنم.

sajjad_kochekian
شنبه 13 شهریور 1389, 00:38 صبح
جدول برنامه ها
code1
EmployeeCode
ModulCode

جدول فرم ها
code
FormName
ModulCode

جدول سطح دسترسی
COde
EmployeeCode
ModuleCode
FormName
Access

بهزادصادقی
شنبه 13 شهریور 1389, 01:18 صبح
دوست عزیز،

من چند چیز را متوجه نمی شوم.

اول اینکه لیست structure های شما کامل نیست. شما فقط اسم ستون ها را آورده اید. باید نوع آنها را هم دانست. حتی مهم تر، رابطه این ستون ها در جداول مختلف با همدیگر است. مهمترین مسئله: primary key هر یک از جداول شما کدام می باشد؟

فعلا، بر اساس آن چه شما نوشته بودید، من این حدس ها را در مورد ساختار جداول شما زده ام، ولی مطمئنا کاملا می توانم اشتباه کرده باشم. می شود بی زحمت درستش را برای من بفرستی:




create table dbo.Modules
(
ModuleCode int identity(1,1) primary key,
code1 int,
EmployeeCode int
)

create table dbo.Forms
(
code int identity(1,1) primary key,
FormName nvarchar(100),
ModuleCode int
)

create table dbo.AccessRights
(
code int identity(1,1) primary key,
EmployeeCode int,
ModuleCode int,
FormName nvarchar(100),
Access nvarchar(100)
)

ASKaffash
شنبه 13 شهریور 1389, 08:42 صبح
اگر بخواهم در کرسر رکورد هایی که در ابتدای آن انتخاب می کنیم داخل یک متغیر بریزم و به ازای هر ردیف که انتخاب می شود کاری انجام شود عمل انتساب کجا باید صورت گیرد

declare @PrsID Int
Declare @i TinyInt , @L Real , @A Real,@code int
Set @i = 0 Set @A = 0

Declare TmPCursor Cursor For
Select code From document Where payment> 1
--set @a= code
Open TmPCursor
While 1=1 Begin
Fetch Next From TmPCursor Into @L
If @@Fetch_Status < > 0 Break
Set @i = @i + 1
Set @A= (select code from Document where Code =@i )
select @i
End
Close TmPCursor
Deallocate TmPCursor
If @i < >0 Set @A = @A / @i

select @i
select @code

سلام
صورت این مسئله به نظر می آید نیازی به کرسر ندارد و یک Avg است صورت اصلی را بگو تا دوستان برایتان Select مناسب را قرار دهند
--------------------

استفاده از cursor در SQL Server 2005 به بالا کاملا اشتباه است. شما هر کاری را که می خواهی با cursor انجام دهی می توانی خیلی تمیز تر و با عملکردی فوق العاده بالاتر بدون cursor انجام دهی. اگر برای من تشریح کنی دقیقا دنبال چی هستی، کمکتان خواهم کرد آن را بدون cursor انجام دهید.
سلام
این موضوع اصلا پایه علمی ندارد قبلا هم در این تالار بحث شده در مواردی مسائلی بدون کرسر اصلا قابل حل نیست اگر شک دارید من یک مسئله طرح کنم و یکی بدون کرسر حل کند

بهزادصادقی
شنبه 13 شهریور 1389, 11:50 صبح
سلام
این موضوع اصلا پایه علمی ندارد قبلا هم در این تالار بحث شده در مواردی مسائلی بدون کرسر اصلا قابل حل نیست اگر شک دارید من یک مسئله طرح کنم و یکی بدون کرسر حل کند

خواهش می کنم دوست غزیز. شما بفرمائید، و من آن را بدون cursor حل خواهم کرد.

ASKaffash
شنبه 13 شهریور 1389, 12:17 عصر
سلام
یک سئوال که بیشتر در مهندسی صنایع کاربرد دارد - در ریاضی کاربردی هم مسائل شبیه این اتفاق می افتد و اما مسئله :
در جدول با ساختار و داده هائی شبیه این :
A B
a1 b1
a1 b2
a1 b3
a1 b4
a1 b5
a2 c1
a2 c2
a2 c3
a3 d1
a4 e1

حالا باید این شاخص محاسبه گردد (انشاالله بهینه سازی شهید نمی شود) :
I1=(b2-b1)^2+(b3-b2+b1)^2+(b4-b3+b2-b1)^2+...
I2=(c2-c1)^2+(c3-c2+c1)^2+...
...
...
و در نهایت میزان I :
I=I1/1-I2/2+I3/3-I4/4+...

بهزادصادقی
شنبه 13 شهریور 1389, 12:57 عصر
با عرض معذرت، من صورت مسئله شما را اصلا نمی فهمم.

اینجا شما چند تا table دارید؟ ساختارشان چی است؟ این حروفی که استفاده نموده اید، مثلا A یا b چی هستند؟ آیا اسم جداول شما هستند؟ آیا اسم ستون های شما هستند؟ آیا متغیر هایی هستند که نمونه مقدایر وارد شده در یک جدول را تشکیل می دهند؟ من اصلا نمی دانم این ترکیب های حروف و اعداد معانی شان از لحاظ ساختار های داده ای یعنی چی؟ اگر شما زحمت بکشید و «مسئله داده ای» خویش را تشریج نمائید، من انشالله آن را بدون استفاده از cursor برای شما حل خواهم کرد.

منظورم از «مسئله داده ای» چه می باشد؟ خوب امکان دارد شما بگوئید، آقا بهزاد، اگر راستش و میگی، این مسئله را بدون استقاده از یک cursor حل کن: یک وزن 800 کیلویی را چگونه آدم می تواند در عرض مدت کمتر از 5 دقیقه از سطح زمین تا مدار 500 کیلومتری زمین به بالا ببرد؟

خوب، این یک مسئله داده ای نیست. برای حل چنین مسئله ای آدم احتیاج به خیلی از مهارت ها و دانش ها دارد که در خارج از حیطه پردازش داده ها و انجام query روی SQL Server (حالا یا با، و یا بدون استقاده از cursor) فرار می گیرند. من آن مسئله را نه با استفاده از cursor می توانم حل کنم و نه بدون استفاده از cursor، چون اصلا مسئله را نمی فهمم و توانایی حل آن از حوضه مهارت ها و دانش من بیرون است. ولی آن دلیل نمی شود که نمی توان تمام مسائل داده ای را در SQL Server بدون استفاده از cursor حل کرد. می توان.

شما اگر واقعا می خواهید ثابت کنید که یک مسئله ای در SQL Server وجود دارد که فقط و فقط با استفاده از یک cursor قابل حل است، و بدون استفاده از یک cursor قابل حل نیست، باید یک سری query که به زبان Transact-SQL نوشته شده است را به من نشان دهید که برای انجام کار خود دارند از یک یا چند cursor استفاده می کنند، و بعد به من بگویی که اگر توانایی دارم، همان مسئله را بدون استقاده از cursor حل کنم. من به شما قول می دهم اگر کد SQL ای به من بدهی که از cursor استفاده می کند، من آن کد را طوری refactor می کنم که همان کار را دقیقا بدون استفاده از cursor انجام دهد. و، در بیشتر مواقع، سرعت و عملکرد کد هم بهتر خواهد شد.

ولی این مسئله ای را که شما طرح کردید، من هیج چیزی ازش سر در نمی آورم. شما همین مسئله را با استفاده از یک cursor حل کن، و راه حل cursor ای اش را برایم بفرست، و من راه حل بدون cursor اش را برایت خواهم فرستاد.

ASKaffash
شنبه 13 شهریور 1389, 13:21 عصر
سلام دوست من
در اینجا فقط یک جدول داریم که دو ستون A , B دارد که هردو فقط عدد هستند و a1 , b1 ... مثل نمونه داده های این جدول هستند و قرار است بایک Select مقدار I نهائی براساس فرمول ارائه شده روی داده ها محاسبه شود در این مثل با یک Select ساده و چند Loop و استفاده از کرسر می توان مسئله را حل کرد

بهزادصادقی
شنبه 13 شهریور 1389, 14:10 عصر
من در اینکه شما به سادگی می توانی این مسئله را با استفاده از یک cursor حل کنی هیچ شکی ندارم.

اگر اشتباه نکنم شما بر این عقیده هستید که حل بهینه این مسئله تنها از طریق استفاده از یک cursor میسر است.

حالا شما زحمت کشیده اید و این مسئله را در اختیار من قرار داده اید تا اگر راست می گویم آن را بدون استفاده از یک cursor حل کنم.

چشم، من هم دقیقا می خواهم همین کار را برای شما بکنم و این کار را هم خواهم کرد. منتهی من یک مشکل دارم. مشکل من این است که شما خیلی را حت و به سادگی صورت مسئله را در چند جمله کوناه تشریج می نمایی و بعد انتظار داری که من هم صورت مسئله را بفهمم.

من مطمئن هستم فهم این مسئله برای شما مثل آب خوردن آسان است، چون احتمالا یه جوری ربطی دارد به رشته کاری یا تحصیلی یا رشته مورد علاقه شما.

ولی من هیچ چیز در مورد این رشته، هر چه باشد، نمی دانم. رشته من پایگاه داده هاست. کار من با select و query ها می باشد. تنها مفاهیمی را که می فهمم مفاهیم ساختار داده ها می باشند. پس اجازه دهید من یک کمی بیشتر خنگ بازی در بیاورم و چند تا سوال دیگر از شما بپرسم که انشالله باعث روشن شدن صورت مسئله برای من خواهد شد.

فرض کنید ما یک جدول از این نوع داده ها را داریم. آیا چند مورد I را می می توانیم در مورد این جدول محاسبه کنیم؟ آیا تمام جدول دارای یک شاخص به نام I خواهد بود که unique است؟ و یا آنکه ما مثلا می توانیم بگوییم که شما هر یک از سطر های جدول را که انتخاب کنی، ما می توانیم برای آن اقدام به محاسبه یک I بکنیم، مثلا تمام سطرهایی را که قبل از این سطر آمده را در محاسبه شرکت بدهیم.

آن طوری که شما جدول را ترسیم کرده اید، یک نوع ترتیب خاصی در جدول دیده می شود. همان طور که می دانید، در SQL Server محتویات یک جدول دارای هیچ ترتیب خاصی نمی باشند. پس می شود بی زحمت این ترتیب را برای من توصیف کنید. آینجا به نطر می رسد شما کل سطرهای جدول را تقسیم کرده اید به گروه هایی که در هر یک از آنها، محتوای یک ستون A مشترک می باشد. بعد آمده اید این گروه ها را به ترتیت تعداد سطر هایشان sort کرده اید. آیا این درست است.

تعداد سطرهای جدول شما محدود است. آیا این کل سطر هایی می باشد که در این جدول وجود داردند؟ آیا سطرهایی دیگری هم بعد از این سطرها هستند که در دیاگرام شما دیده نمی شوند؟

sajjad_kochekian
شنبه 13 شهریور 1389, 23:11 عصر
دوست عزیز،

اول اینکه لیست structure های شما کامل نیست. ..



من یک اسکریپت از دیتابیس گذاشتم.



CREATE TABLE [dbo].[formname](
[code] [int] IDENTITY(1,1) NOT NULL,
[formname] [nvarchar](50) NULL,
[module] [int] NULL,
CONSTRAINT [PK_formname] PRIMARY KEY CLUSTERED
(
[code] ASC
)WITH (PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[moduleform](
[code] [int] IDENTITY(1,1) NOT NULL,
[empcode] [int] NULL,
[module] [int] NULL,
[formName] [int] NULL,
CONSTRAINT [PK_moduleform] PRIMARY KEY CLUSTERED
(
[code] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[modulper](
[code] [int] IDENTITY(1,1) NOT NULL,
[empCode] [int] NULL,
[modul] [int] NULL,
CONSTRAINT [PK_modulper] PRIMARY KEY CLUSTERED
(
[code] ASC
)WITH (PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

بهزادصادقی
شنبه 13 شهریور 1389, 23:35 عصر
خوب، مرسی. این خیلی بهتره. بدون حداقل این اطلاعات شما چه طوری انتظار داری کسی بتواند جواب سوال شما را بدهد؟ مثل این است که من یک سوال پست کنم بگم خواهش می کنم به من بگین اتومبیل خود را چه جوری تعمیر کنم، بدون اینکه بگم اون زهوار در رفته چه مدلی یه، مسئله اش چیه و غیره.

دست شما درد نکنه. حالا جند تا سوال دیگه. ولی اولش، من می خوام کد تو را یک کمی ساده تر کنم تا بشه راحت تر خواندتش:



CREATE TABLE dbo.FormName
(
code int IDENTITY(1,1) NOT NULL primary key,
formname nvarchar(50) NULL,
module int NULL
)

CREATE TABLE dbo.ModuleForm
(
code int IDENTITY(1,1) NOT NULL primary key,
empcode int NULL,
module int NULL,
formName int NULL
)

CREATE TABLE dbo.ModulPer(
code int IDENTITY(1,1) NOT NULL primary key,
empCode int NULL,
modul int NULL
)


سوالات:

1. جدول FormName یک ستونی دارد به اسم module. جدول ModuleForm هم یک ستون دارد به اسم module. جدول ModulPer هم یک ستون دارد به اسم modul. آیا همه این ستون ها نماینده یک چیز هستند؟ آیا جدولی به اسم Module وجود دارد؟ اگر وجود دارد، آیا این جدول یک کم خجالتی است؟ چون من کدش را اینجا نمی بینم. می شود ازش خواهش کنید یک سری به ما بزند؟ در ضمن، شما که داری این کار رو می کنی، اگر جدول دیگه ای هم دیدی که این ور و اون ور نشسته ولی امکان دارد اینجا لارم شه، مثلا احیانا چیزی مثل یک جدول user یا employee ها، بی زحمت از آنها هم بخواه یک تک پا بیان اینجا و کدشان را به ما نشان بدن.

2. جدول FormName به نظر می رسد با ذخیره شناسه یک فرم و شناسه یک ماژول، یک رابطه یک به یک بین این دو شیئ ایجاد می نماید. ولی می بینیم که جدول ModuleForm هم یک شناسه برای یک ماژول دارد و هم یک شناسه برای یک FormName. آیا اینها تکراری هستند؟ اصولا رابطه بین یک فورم و یک ماژول چه می باشد؟ هر فورم چند تا ماژول می تواند داشته باشد و بر عکس. این رابطه ها چگونه در این جداول ذخیره می شود؟

در حال حاضر، چنین به نظر می رسد که امکان دارد مشکل شما اصلا یک cursor نباشد. من دارم این احساس رو به دست می آورم که شاید مشکل اصلی شما طراحی جداول حاضرتون باشد.

ASKaffash
یک شنبه 14 شهریور 1389, 08:22 صبح
سلام دوست من
فرض براین است که این جدول یک View از جدول مثلا دستور ذیل است :
Select A,B From T Where MyWhere Order By A
بنابراین مشاهده می کنید که برای هر دستور Select شما مقدار I متفاوت خواهید داشت درضمن من 20 سال است که بانک اطلاعاتی کار هستم و تخصص ام نرم افزار است ولی نسبت به رشته های دیگر بیگانه نیستم

بهزادصادقی
یک شنبه 14 شهریور 1389, 10:51 صبح
در اینکه شما بسیار باهوش تر و با تدبیر تر از من هستید که شکی نیست. خود من هم که عرض کردم در پست قبلی خود، من خنگ هستم.

به هر حال، متاسفانه خنگی من به آن حد رسیده که توانایی درک صورت مسئله شما را هنوز ندارم. من چند تا سوال مستقیم مطرح کردم، ولی متاسفانه اصلا نمی فهمم که این پست آخر شما چطور جواب آنها را دارد می دهد. با توجه به ناتوانی من در حتی درک یک همچین مسئله ساده ای، من از حضور شما به خاطر اطلاف وقت حضرتعالی معذرت می خواهم. اگر احیانا در آینده ای نا محتمل، خداوند یاری کرد و توان فهم صورت مسئله شما را به من اعتاء نمود، من سعی خواهم کرد از خجالت شما در بیاییم.

باز هم ببخشید.

sajjad_kochekian
یک شنبه 14 شهریور 1389, 19:50 عصر
سوالات:

1. جدول FormName یک ستونی دارد به اسم module. جدول ModuleForm هم یک ستون دارد به اسم module. جدول ModulPer هم یک ستون دارد به اسم modul. آیا همه این ستون ها نماینده یک چیز هستند؟ آیا جدولی به اسم Module وجود دارد؟ اگر وجود دارد، آیا این جدول یک کم خجالتی است؟ چون من کدش را اینجا نمی بینم. می شود ازش خواهش کنید یک سری به ما بزند؟ در ضمن، شما که داری این کار رو می کنی، اگر جدول دیگه ای هم دیدی که این ور و اون ور نشسته ولی امکان دارد اینجا لارم شه، مثلا احیانا چیزی مثل یک جدول user یا employee ها، بی زحمت از آنها هم بخواه یک تک پا بیان اینجا و کدشان را به ما نشان بدن.


بله یک جدول با دو فیلد یکی کد برنامه و دیگری نام برنامه.
البته من این ها را با هم لینک نکردم و همین طور ازش استفاده می کنم
مثال:
کد: 1 برنامه حسابداری
کد: 2 برنامه انبار


2. جدول FormName به نظر می رسد با ذخیره شناسه یک فرم و شناسه یک ماژول، یک رابطه یک به یک بین این دو شیئ ایجاد می نماید. ولی می بینیم که جدول ModuleForm هم یک شناسه برای یک ماژول دارد و هم یک شناسه برای یک FormName. آیا اینها تکراری هستند؟ اصولا رابطه بین یک فورم و یک ماژول چه می باشد؟ هر فورم چند تا ماژول می تواند داشته باشد و بر عکس. این رابطه ها چگونه در این جداول ذخیره می شود؟

در حال حاضر، چنین به نظر می رسد که امکان دارد مشکل شما اصلا یک cursor نباشد. من دارم این احساس رو به دست می آورم که شاید مشکل اصلی شما طراحی جداول حاضرتون باشد.

رابطه یک به یک نیست چون ممکن یک برنامه 100 تا فرم داشته باشه و بعضی فرم های در کلیه برنامه ها استفاده میشه و یک نکته دیگه این که بعضی مواقع چند برنامه داخل یک پروژه است و بعضی مواقع جدا از همدیگر.