PDA

View Full Version : سوال: foreachدر sql



sama552
شنبه 06 آذر 1389, 08:40 صبح
با سلام
من يك store procedure دارم كه مي خوام اون را بر اساس هر فيلد از جدولم اجرا كنم
به عنوان مثال فرض كنيد كه يك جدول كاربران دارم كه اينstore procedure قرار است idي هر كاربر را به عنوان پارامتر گرفته واجرا شود foreach اينجا چطوري پياده سازي ميشه؟
اگه راه حل بهتري هم سراغ داريدلطفا راهنمايي كنيد

حمیدرضاصادقیان
شنبه 06 آذر 1389, 08:46 صبح
سلام. فکر نمیکنم در دستورات SQL بتونید از ForEach استفاده کنید. میتونید از یک حلقه while استفاده کنید.
یا در نرم افزارتون از این نوع حلقه استفاده کنید.
برای راه حل مناسبتر باید بفرمائید دقیقا میخواهید چه عملی رو روی هرکاربر انجام بدید شاید خیلی راحتتر بشه انجام داد.
موفق باشید

sama552
شنبه 06 آذر 1389, 10:03 صبح
سلام. فکر نمیکنم در دستورات SQL بتونید از ForEach استفاده کنید. میتونید از یک حلقه while استفاده کنید.
یا در نرم افزارتون از این نوع حلقه استفاده کنید.
برای راه حل مناسبتر باید بفرمائید دقیقا میخواهید چه عملی رو روی هرکاربر انجام بدید شاید خیلی راحتتر بشه انجام داد.
موفق باشید


اگر ممكنه ميشه بگيد كه اگر من اين كار را نخوام در نرم افزار انجام بدم بدم يعني همه كار سمت sql انجام بشه بايد چه كار كنم؟
به اين صورت كه به ازاي هر فيلد آي دي جدول كاربران كه به عنوان پارامتر به storeprocedure فرستاده ميشه اين storeorocedure اجرا بشه

حمیدرضاصادقیان
شنبه 06 آذر 1389, 10:18 صبح
سلام.
عرض کردم داخل یک procedure دیگه میتونید با استفاده از حلقه while اینکارو بکنید.
ولی بهتره شما بگید اون Procedure روی جدول user ها چه کاری انجام میده احتمال داره با یک Query بشه کارشو انجام داد و نیازی به حلقه نباشه.

sama552
شنبه 06 آذر 1389, 11:47 صبح
سلام.
عرض کردم داخل یک procedure دیگه میتونید با استفاده از حلقه while اینکارو بکنید.
ولی بهتره شما بگید اون Procedure روی جدول user ها چه کاری انجام میده احتمال داره با یک Query بشه کارشو انجام داد و نیازی به حلقه نباشه.

هنگام استفاده از while با اين خطا مواجه ميشم
The query has exceeded the maximum number of result sets that can be displayed in the results grid. Only the first 100 result sets are displayed in the grid.

حمیدرضاصادقیان
شنبه 06 آذر 1389, 11:52 صبح
کجا از While دارید استفاده میکنید.؟
کدتون رو اینجا بنویسید/

sama552
شنبه 06 آذر 1389, 11:55 صبح
کجا از While دارید استفاده میکنید.؟
کدتون رو اینجا بنویسید/
declare @LastCard_Id int
set @LastCard_Id=0
declare @LastCard_IdToHandle int
set @LastCard_IdToHandle=1
while @LastCard_Id<>@LastCard_IdToHandle
Begin

set @LastCard_Id=@LastCard_IdToHandle

select top 1 @LastCard_IdToHandle=Id
from card
where Id>@LastCard_Id
order by Id


if(@LastCard_Id<>@LastCard_IdToHandle)
begin
exec sp_GardesheCard 78,@LastCard_Id,21,0

end

end

Reza_Yarahmadi
شنبه 06 آذر 1389, 12:15 عصر
The query has exceeded the maximum number of result sets that can be displayed in the results grid. Only the first 100 result sets are displayed in the grid.
اين پيغام مربوط به دستورات نميشه ، SQL Server نميتونه بيش از 100 نتيجه رو نمايش بده ، چون شما توي حلقه بيشتر از اين تعداد دستور (sp_GardesheCard) اجرا ميكنيد اين پيغام ظاهر ميشه. توي نمايش هم بايد اين نتايج رو با هم تركيب كنيد و ... خلاصه كلي دردسر بكشيد تا نتيجه مورد نظر رو نمايش بديد.
براي حلش ميتونيد داده هاي خروجي رو توي يك جدول كمكي ذخيره كنيد و در نهايت تمام داده هاي جدول كمكي رو نمايش بديد.

sama552
شنبه 06 آذر 1389, 13:10 عصر
اين پيغام مربوط به دستورات نميشه ، SQL Server نميتونه بيش از 100 نتيجه رو نمايش بده ، چون شما توي حلقه بيشتر از اين تعداد دستور (sp_GardesheCard) اجرا ميكنيد اين پيغام ظاهر ميشه. توي نمايش هم بايد اين نتايج رو با هم تركيب كنيد و ... خلاصه كلي دردسر بكشيد تا نتيجه مورد نظر رو نمايش بديد.
براي حلش ميتونيد داده هاي خروجي رو توي يك جدول كمكي ذخيره كنيد و در نهايت تمام داده هاي جدول كمكي رو نمايش بديد.

ممنون از راهنماييتون ولي هاست من اجازه كار با جدول هاي كمكي رانميدهد راه حل ديگه اي براي اين كار وجود نداره؟

Reza_Yarahmadi
شنبه 06 آذر 1389, 13:25 عصر
دوست عزيز دستورات sp_GardesheCard رو اينجا بذاريد شايد بشه راهي واسش پيدا كرد.

Reza_Yarahmadi
شنبه 06 آذر 1389, 13:56 عصر
كوئري زير رو امتحان كنيد ببينيد درست ميشه يا نه.
Declare @Card_Id varchar(max), @Str varchar(max)
Set @Str = ''
Set @Card_Id = ''
Set @Card_Id = (Select Id + ',' From card For XML Path(''))
Set @Card_Id = SubString(@Card_Id, 1, Len(@Card_Id) - 1)

Set @Str = '
Declare
@Student_Id int,
@Teacher_Id int,
@Perfect int

Set @Student_Id = ' + 78 + '
Set @Teacher_Id = ' + 21 + '
Set @Perfect = ' + 0 + '


if (@Perfect = 0)
begin
select studylog.Student_Id,
(select count(Step)from studylog where step=0 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id =s.Card_Id)as step0,
(select count(Step)from studylog where step=1 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step1,
(select count(Step)from studylog where step=2 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step2,
(select count(Step)from studylog where step=3 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step3,
(select count(Step)from studylog where step=4 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step4,
(select count(Step)from studylog where step=5 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step5,
(select count(Step)from studylog where step=6 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step6
from studylog s where Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id IN (' + @Card_Id + ') and step=6
group by studylog.Student_Id
end
if(@perfect=1)
begin
select studylog.Student_Id,
(select count(Step)from studylog where step=0 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step0,
(select count(Step)from studylog where step=1 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step1,
(select count(Step)from studylog where step=2 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step2,
(select count(Step)from studylog where step=3 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step3,
(select count(Step)from studylog where step=4 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step4,
(select count(Step)from studylog where step=5 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step5,
(select count(Step)from studylog where step=6 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step6
from studylog where Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id IN (' + @Card_Id + ') and step=6
group by studylog.Student_Id
end'
EXEC (@Str)

sama552
شنبه 06 آذر 1389, 14:24 عصر
كوئري زير رو امتحان كنيد ببينيد درست ميشه يا نه.
Declare @Card_Id varchar(max), @Str varchar(max)
Set @Str = ''
Set @Card_Id = ''
Set @Card_Id = (Select Id + ',' From card For XML Path(''))
Set @Card_Id = SubString(@Card_Id, 1, Len(@Card_Id) - 1)

Set @Str = '
Declare
@Student_Id int,
@Teacher_Id int,
@Perfect int

Set @Student_Id = ' + 78 + '
Set @Teacher_Id = ' + 21 + '
Set @Perfect = ' + 0 + '


if (@Perfect = 0)
begin
select studylog.Student_Id,
(select count(Step)from studylog where step=0 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id =s.Card_Id)as step0,
(select count(Step)from studylog where step=1 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step1,
(select count(Step)from studylog where step=2 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step2,
(select count(Step)from studylog where step=3 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step3,
(select count(Step)from studylog where step=4 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step4,
(select count(Step)from studylog where step=5 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step5,
(select count(Step)from studylog where step=6 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step6
from studylog s where Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id IN (' + @Card_Id + ') and step=6
group by studylog.Student_Id
end
if(@perfect=1)
begin
select studylog.Student_Id,
(select count(Step)from studylog where step=0 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step0,
(select count(Step)from studylog where step=1 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step1,
(select count(Step)from studylog where step=2 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step2,
(select count(Step)from studylog where step=3 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step3,
(select count(Step)from studylog where step=4 and Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step4,
(select count(Step)from studylog where step=5 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step5,
(select count(Step)from studylog where step=6 and Student_Id =@Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id=s.Card_Id)as step6
from studylog where Student_Id = @Student_Id and studylog.teacher_Id=@Teacher_Id and studylog.card_Id IN (' + @Card_Id + ') and step=6
group by studylog.Student_Id
end'
EXEC (@Str)

ممنونم
ولي با اين درست نشد
شما لطف مي كنيد الگوريتم راه حلتون رو بگيد و توضيح بيشتري بديد تا من ببينم با اين تغييرات مي تونم درست اش كنم يا نه

Reza_Yarahmadi
شنبه 06 آذر 1389, 14:46 عصر
دوست عزيز راحتترين كار اينه كه يك جدول ديگه توي بانكتون درست كنيد با فرمت خروجي sp_GardesheCard بعد هر بار خروجي Sp رو توي جدول ذخيره كنيد و در نهايت محتويات جدول رو نمايش بديد.
Declare @LastCard_Id int,
@LastCard_IdToHandle int

Set @LastCard_Id = 0
Set @LastCard_IdToHandle = 1

While @LastCard_Id <> @LastCard_IdToHandle
Begin
Set @LastCard_Id = @LastCard_IdToHandle
Select Top 1 @LastCard_IdToHandle = Id
From
card
Where
Id>@LastCard_Id
Order By
Id
If(@LastCard_Id <> @LastCard_IdToHandle)
Begin
Insert Into TempTable EXEC sp_GardesheCard 78, @LastCard_Id, 21, 0
End
End
Select * From TempTable
Delete From TempTable