日期:2014-05-18  浏览次数:20411 次

进牛人优化下SQL存储过程
合成某个卡片,数据库中设置了多个合成材料,这个材料有可能1个,也有可最多是13个,我现在是一个个逐一判断,有点傻瓜,是否可以优化?求高手帮忙。
ALTER PROCEDURE [dbo].[Usp_Prize_Mixture_Result] --卡片合成结果

@ID INT, --ID

@Code INT, --编码
@Type INT --类型(25,50,75,100)
AS
BEGIN
BEGIN TRAN Tran_MixturePrize
--检测VIP会员
DECLARE @VIP INT 
SELECT @VIP = F_VIP FROM T_Prize_Mixture WHERE K_Code = @Code
IF @VIP = 1
BEGIN
IF NOT EXISTS(SELECT * FROM T_User_VIP WHERE K_ID=@ID)
BEGIN
SELECT 2
RETURN
END
END

DECLARE @PropCode int
DECLARE @Num int
DECLARE @Money1 int
DECLARE @Money2 int
DECLARE @Money3 int
DECLARE @Money4 int

SELECT @PropCode = F_Code, @Num = F_Num,@Money1 = F_Money1,
@Money2 = F_Money2,@Money3 = F_Money3,@Money4 = F_Money4

FROM T_Prize_Mixture WHERE K_Code = @Code

--检测特殊道具
IF @PropCode > 0 AND @Num > 0 
BEGIN
IF NOT EXISTS(SELECT * FROM T_Prize_UserTicket
WHERE F_ID = @ID
AND F_Code = @PropCode
AND F_Quantity >= @Num)
BEGIN
ROLLBACK TRAN Tran_MixturePrize
SELECT 3
RETURN
END
ELSE
BEGIN
EXECUTE [Usp_Prize_UsePrize] @ID,@PropCode,@Num
END
END

DECLARE @Money int
IF @Type = 25
BEGIN
set @Money = @Money1
END

IF @Type = 50
BEGIN
set @Money = @Money2
END

IF @Type = 75
BEGIN
set @Money = @Money3
END

IF @Type = 100
BEGIN
set @Money = @Money4
END

--检测钱
DECLARE @sign0 INT
EXECUTE [Usp_User_UpdateYMoney_Public] @ID,@Money,0,@sign0 out
IF @sign0 = 0 
BEGIN
ROLLBACK TRAN Tran_MixturePrize
SELECT 4
RETURN
END

--逐一检测合成材料是否足够

IF @Code = 13305 --生日卡(1986/12/30)--11501[0]--12302[2]--12309[9]--12314[A/1]
BEGIN
--declare @today varchar(30)
--set @today = CONVERT(varchar(30),GETDATE(),111)

--declare @Num1 varchar(1)
--declare @Num2 varchar(1)
--declare @Num3 varchar(1)
--declare @Num4 varchar(1)
--declare @Num5 varchar(1)
--declare @Num6 varchar(1)
--declare @Num7 varchar(1)
--declare @Num8 varchar(1)

--set @Num1 = substring(@today,1,2)
--set @Num2 = substring(@today,2,3)
--set @Num3 = substring(@today,3,4)
--set @Num4 = substring(@today,4,5)
--set @Num5 = substring(@today,6,7)
--set @Num6 = substring(@today,7,8)
--set @Num7 = substring(@today,9,10)
--set @Num8 = substring(@today,10,11)

--DECLARE @Code1 int

--SELECT * FROM T_Prize_UserTicket WHERE 
--F_ID = @ID AND F_Quantity > 0 AND F_Code = @Code1

ROLLBACK TRAN Tran_MixturePrize
SELECT 5
RETURN
END
ELSE
BEGIN
DECLARE @MixCode1 int
DECLARE @MixNum1 int
DECLARE @MixCode2 int
DECLARE @MixNum2 int
DECLARE @MixCode3 int
DECLARE @MixNum3 int
DECLARE @MixCode4 int
DECLARE @MixNum4 int
DECLARE @MixCode5 int
DECLARE @MixNum5 int
DECLARE @MixCode6 int
DECLARE @MixNum6 int
DECLARE @MixCode7 int
DECLARE @MixNum7 int
DECLARE @MixCode8 int
DECLARE @MixNum8 int
DECLARE @MixCode9 int
DECLARE @MixNum9 int
DECLARE @MixCode10 int
DECLARE @MixNum10 int
DECLARE @MixCode11 int
DECLARE @MixNum11 int
DECLARE @MixCode12 int
DECLARE @MixNum12 int
DECLARE @MixCode13 int
DECLARE @MixNum13 int

SELECT @MixCode1=F_Code1,@MixNum1=F_Num1,@MixCode2=F_Code2,@MixNum2=F_Num2,
@MixCode3=F_Code3,@MixNum3=F_Num3,@MixCode4=F_Code4,@MixNum4=F_Num4,
@MixCode5=F_Code