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 ظاهر نمیشه).
کلا چیزایی که من به عنوان یه تازه کار بلد بودم اینا بود و با توجه به تازه کار بودنم فکر میکنم درسته ولی جواب اشتباه میگیرم .اگه کسی بگه کجای کار رو اشتباه میکنم کمک بزرگی کرده یا اگه کلا این روش من در آوردی من لقمه رو دور سر چرخوندنه یه روش خوب بگید . ممنون از همه :قلب:
از اونجایی که زیاد به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 ظاهر نمیشه).
کلا چیزایی که من به عنوان یه تازه کار بلد بودم اینا بود و با توجه به تازه کار بودنم فکر میکنم درسته ولی جواب اشتباه میگیرم .اگه کسی بگه کجای کار رو اشتباه میکنم کمک بزرگی کرده یا اگه کلا این روش من در آوردی من لقمه رو دور سر چرخوندنه یه روش خوب بگید . ممنون از همه :قلب: