ورود

View Full Version : اجرا کردن query برای هر سطر جدول به همراه مثال تصویری



leopard
دوشنبه 06 تیر 1390, 13:05 عصر
سلام به دوستان گل.

از اونجایی که زیاد بهMicrosoft SQL Server آشنایی ندارم به مشکل خوردم که کلا سوال و با تصویر اینجا میزارم


دو تا Table دارم که تو شکل میبینید

ID توی table game کلید اصلی و توی table usersgames به عنوان کلیدخارجی هستش(ID_games).

این table game:
http://m1.imagemoon.us/images/17136IMMtable_games.PNG

اینم table usersgames :
http://m1.imagemoon.us/images/17135IMMtable_usersgames.PNG


حالا من کلا نیازم ازاین دو تا table اینه :
وقتی اینا رو با هم inner join که میکنم یه table جدید ساخته میشه با این ستونا
username,ID_games,z_mosavi,z_mizban,z_mehman,mabla gh,status
این table مثلا 20 تا رکورد بر میگردونه من میخوام برای هر رکورد یه insert انجام بدم...

خودم یه stored procedured نوشتم که این زیر با توضیحش میارم
تو ظاهر انگار درست ه ولی تو عمل اشتباه جواب میده(البته شاید چون من تازه کارم تو sql server فکر میکنم درسته )

USE [website]
GO
/****** Object: StoredProcedure [dbo].[pardakht_jayze] Script Date: 06/27/2011 12:55:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[pardakht_jayze]
( @jayze tinyint OUTPUT)

AS
BEGIN
declare @username nvarchar(225)
declare @temp money;
declare @tedad smallint;
declare @ID_game bigint;
set @tedad=1;

set @tedad=(select COUNT(*)
from games inner join usersgames on ID=ID_games where status!=-1 AND status=pishbini AND payed=0)

while(@tedad>0)
BEGIN


set @ID_game=(select top 1 ID_games
from games inner join usersgames on ID=ID_games where status!=-1 AND status=pishbini AND payed=0)

set @username=(select top 1 username
from games inner join usersgames on ID=ID_games where status!=-1 AND status=pishbini AND payed=0)


set @temp=(select top 1 temp=( case when status=0 then z_mizban*mablagh
when status=1 then Z_mosavi*mablagh
when status=2 then z_mehman*mablagh
END)
from games inner join usersgames on ID=ID_games where status!=-1 AND status=pishbini AND payed=0
)


insert into mojodi(username,mablagh,paydate,cartnumber,banknam e,jayze)
values(@username,0,GETDATE(),NULL,NULL,@temp);
update usersgames set payed=1 where username=@username AND ID_games=@ID_game;
set @tedad=@tedad-1;
END
set @jayze=1;
RETURN @jayze;
END

توضیح SP اینه :

@tedad : توی این تعداد رکورد هایی که از inner join بین دو تا table بالا بدست میاد رو نشون میده.
@ID_game: اینم با استفاده از top 1 مقدار ID_game سطر اول(رکورد اول) رو بر میگردونه .
@username:اینم با استفاده از top 1 مقدار username سطر اول(رکورد اول) رو بر میگردونه .
@temp: اینم میاد با استفاده از status میگه که کدوم ضریب (Z_mizban یا Z_mehmanیا Z_mosavi) تو mablagh ضرب بشه و توی temp ریخته بشه .


خوب این از تعریف متغیر ها . حالا نحوه کار :
یه حلقه while دارم که به تعداد متغیر @tedad دستورای داخلش رو اجرا میکنه .
دستورات داخلش هم همونطور که بالاتر گفتم @ID_game و @username و @temp رو برای سطر اول بر میگردونه بعد به ازاشون یه Insert و Update انجام میشه (این Update یه کاری میکنه که دیگه دفعه بعد وقتی اون 2 تا table بالا inner join مشین سطری اول عوض بشه-یعنی اون سطری که به ازاش Insert انجام دادیم دیگه توی inner join ظاهر نمیشه).

کلا چیزایی که من به عنوان یه تازه کار بلد بودم اینا بود و با توجه به تازه کار بودنم فکر میکنم درسته ولی جواب اشتباه میگیرم .اگه کسی بگه کجای کار رو اشتباه میکنم کمک بزرگی کرده یا اگه کلا این روش من در آوردی من لقمه رو دور سر چرخوندنه یه روش خوب بگید . ممنون از همه :قلب:

حمیدرضاصادقیان
سه شنبه 07 تیر 1390, 10:26 صبح
سلام.
شما این دستور رو تست کنید .

INSERT INTO Mojodi (username,mablagh,paydate,cartnumber,banknam e,jayze)
SELECT Username,0,GETDATE(),NULL,NULL,
CASE when status=0 then z_mizban*mablagh
when status=1 then Z_mosavi*mablagh
when status=2 then z_mehman*mablagh
END AS Temp
from games inner join usersgames on ID=ID_games
where status!=-1 AND status=pishbini AND payed=0


در این دستور دیگه نیازی به حلقه و اینکارهایی که کردید نیستو فقط یک Backup از دیتابیس بگیرید و این دستور رو اجرا کنید که اگر اشکالی ایجاد شد بتوانید به حالت قبلی برگردونید.
بعد از اون هم کافیه فقط دستور update زیر رو انجام بدید.


update usersgames set payed=1