The following function is fine in SQL Server express but using LocalDB it crashes the computer:
After creating function - to calculate the score on a bridge hand given the board number, declarer, contract and result
select dbo.fn_CalculateBoardScore (1, 'N', '4 H', '=')
The Function:
CREATE FUNCTION [dbo].[fn_CalculateBoardScore]
(
@BoardNo int,
@Declarer varchar(1),
@Contract varchar(10),
@result varchar(3)
)
RETURNS int
AS
BEGIN
DECLARE
@Vul int = 0,
@IsPlayed varchar(1) = '1',
@NumTricksBid int, /*Number of tricks Bid for*/
@Denomination varchar(1), /*Spade=S, Heart=H, Diamond=D, Club=C, NoTrump=N, PassedIn=P*/
@MajMinNt int, /* minor=0, Major=1, NT=2*/
@Doubled int = 0,
@ReDoubled int = 0,
@TricksMade int = 0,
@UnderTricks int =0,
@ScoreValue int,
@DecVul int = 0,
@TrickScore int =0,
@SSlamBonus int = 500,
@GSlamBonus int = 1000,
@Overtricks int,
@OvertrickValueNV int,
@OvertrickValueVul int = 0,
@PartScoreBonus int = 50,
@GameScoreBonus int = 300,
@DoubledBonus int = 0,
@ReDoubledBonus int = 0,
@MinorTrickValue int = 20,
@MajorTrickValue int = 30,
@NotrumpFirstTrickValue int = 40,
@Under1NV int = -50,
@Under1Vul int = -100,
@Under2PlusNV int =-50,
@Under2PlusVul int = -100,
@Under4PlusNV int = 0,
@TrickCounter int =0
/*---------------------------------------*/
/*Find out who's vul on this board
*/
set @Vul = (@BoardNo - 1 + ((@BoardNo-1)/4)%4)%4
if((@Vul=1 OR @Vul=3) AND (@Declarer='N' OR @Declarer='S'))
Begin
set @DecVul=1
set @GameScoreBonus = 500
set @SSlamBonus = 750
set @GSlamBonus = 1500
END
if((@Vul=2 OR @Vul=3) AND (@Declarer='E' OR @Declarer='W'))
Begin
set @DecVul=1
set @GameScoreBonus = 500
set @SSlamBonus = 750
set @GSlamBonus = 1500
END
/*Clear out any spaces*/
set @contract=REPLACE ( @Contract, ' ' , '' )
set @contract=UPPER ( @Contract )
set @contract=REPLACE ( @Contract, 'NT' , 'N' )
/* Check if the board was actually played in a contract*/
set @IsPlayed=SUBSTRING(@contract,1,1)
SELECT @NumTricksBid =
CASE @IsPlayed
when 'P' then 0
when '1' then 1
when '2' then 2
when '3' then 3
when '4' then 4
when '5' then 5
when '6' then 6
when '7' then 7
ELSE NULL
END
IF (@Contract='NP' OR @Contract is null)
BEGIN
set @ScoreValue = -9001
RETURN @ScoreValue
END
IF (@NumTricksBid is NULL)
BEGIN
set @ScoreValue = NULL
RETURN @ScoreValue
END
ELSE IF (@NumTricksBid = 0)
BEGIN
set @ScoreValue = 0
RETURN @ScoreValue
END
/* If passed in or Not Played then function should not reach here!!!!!*/
/* Now find the Denomination*/
set @Denomination=SUBSTRING(@contract,2,1)
/* And the number of tricks actually made in NZ terms e.g. 3H +2 is making 5*/
SELECT @TricksMade =
case @result
WHEN '=' then @NumTricksBid
WHEN '+1' then @NumTricksBid + 1
WHEN '+2' then @NumTricksBid + 2
WHEN '+3' then @NumTricksBid + 3
WHEN '+4' then @NumTricksBid + 4
WHEN '+5' then @NumTricksBid + 5
WHEN '+6' then @NumTricksBid + 6
ELSE 0
END
/* If failed contract - set Undertricks*/
SELECT @UnderTricks =
case @result
WHEN '-1' then 1
WHEN '-2' then 2
WHEN '-3' then 3
WHEN '-4' then 4
WHEN '-5' then 5
WHEN '-6' then 6
WHEN '-7' then 7
WHEN '-8' then 8
WHEN '-9' then 9
WHEN '-10' then 10
WHEN '-11' then 11
WHEN '-12' then 12
WHEN '-13' then 13
ELSE 0
END
/* Now find out if Major, Minor or NT contract*/
SELECT @MajMinNt =
case @Denomination
WHEN 'C' then 0
WHEN 'D' then 0
WHEN 'H' then 1
WHEN 'S' then 1
WHEN 'N' then 2
ELSE NULL
END
/* Find out if it was doubled or re-doubled*/
IF (SUBSTRING(@contract,3,1)='X')
BEGIN
set @Doubled = 1
set @DoubledBonus = 50
set @MinorTrickValue = 40
set @MajorTrickValue = 60
set @NotrumpFirstTrickValue = 80
set @OvertrickValueNV = 100
set @OvertrickValueVul = 200
set
@Under1NV = -100
set
@Under1Vul = -200
set
@Under2PlusNV =-200
set
@Under2PlusVul = -300
set
@Under4PlusNV = -100
IF (SUBSTRING(@contract,4,1)='X')
BEGIN
set @ReDoubled = 1
set @ReDoubledBonus = 100
set @DoubledBonus = 0
set @MinorTrickValue = 80
set @MajorTrickValue = 120
set @NotrumpFirstTrickValue = 160
set @OvertrickValueNV = 200
set @OvertrickValueVul = 400
set
@Under1NV = -200
set
@Under1Vul = -400
set
@Under2PlusNV =-400
set
@Under2PlusVul = -600
set
@Under4PlusNV = -200
END
END
/* NOW we know what the contract is, if it was doubled or re-doubled, AND tricks made*/
IF (@MajMinNt=0 AND @TricksMade>0)
BEGIN
IF (@OvertrickValueNV=0)
BEGIN
set @OvertrickValueNV=@MinorTrickValue
END
IF (@OvertrickValueVul=0)
BEGIN
set @OvertrickValueVul=@MinorTrickValue
END
set @ScoreValue= @NumTricksBid * @MinorTrickValue
if (@ScoreValue < 100)
begin
set @ScoreValue= @TricksMade * @MinorTrickValue + @PartScoreBonus + @DoubledBonus + @ReDoubledBonus
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=0)
BEGIN
set @ScoreValue= @NumTricksBid * @MinorTrickValue + @PartScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueNV
END
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=1)
BEGIN
set @ScoreValue= @NumTricksBid * @MinorTrickValue + @PartScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueVul
END
end
else if (@ScoreValue >= 100)
begin
set @ScoreValue= @TricksMade * @MinorTrickValue + @GameScoreBonus + @DoubledBonus + @ReDoubledBonus
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=0)
BEGIN
set @ScoreValue= @NumTricksBid * @MinorTrickValue + @GameScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueNV
END
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=1)
BEGIN
set @ScoreValue= @NumTricksBid * @MinorTrickValue + @GameScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueVul
END
IF (@NumTricksBid=6)
BEGIN
set @ScoreValue= @ScoreValue + @SSlamBonus
END
IF (@NumTricksBid=7)
BEGIN
set @ScoreValue= @ScoreValue + @GSlamBonus
END
end
END
/*--=====================================================================*/
IF (@MajMinNt=1 AND @TricksMade>0)
BEGIN
IF (@OvertrickValueNV=0)
BEGIN
set @OvertrickValueNV=@MajorTrickValue
END
IF (@OvertrickValueVul=0)
BEGIN
set @OvertrickValueVul=@MajorTrickValue
END
set @ScoreValue= @NumTricksBid * @MajorTrickValue
if (@ScoreValue < 100)
begin
set @ScoreValue= @TricksMade * @MajorTrickValue + @PartScoreBonus + @DoubledBonus + @ReDoubledBonus
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=0)
BEGIN
set @ScoreValue= @NumTricksBid * @MajorTrickValue + @PartScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueNV
END
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=1)
BEGIN
set @ScoreValue= @NumTricksBid * @MajorTrickValue + @PartScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueVul
END
end
else if (@ScoreValue >= 100)
/*
begin*/
/*
set @ScoreValue=@TricksMade * @MinorTrickValue + @GameScoreBonus + @DoubledBonus + @ReDoubledBonus*/
/*
end*/
begin
set @ScoreValue= @TricksMade * @MajorTrickValue + @GameScoreBonus + @DoubledBonus + @ReDoubledBonus
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=0)
BEGIN
set @ScoreValue= @NumTricksBid * @MajorTrickValue + @GameScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueNV
END
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=1)
BEGIN
set @ScoreValue= @NumTricksBid * @MajorTrickValue + @GameScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueVul
END
IF (@NumTricksBid=6)
BEGIN
set @ScoreValue= @ScoreValue + @SSlamBonus
END
IF (@NumTricksBid=7)
BEGIN
set @ScoreValue= @ScoreValue + @GSlamBonus
END
end
END
/*--=====================================================================*/
IF (@MajMinNt=2 AND @TricksMade>0)
BEGIN
IF (@OvertrickValueNV=0)
BEGIN
set @OvertrickValueNV=@MajorTrickValue
END
IF (@OvertrickValueVul=0)
BEGIN
set @OvertrickValueVul=@MajorTrickValue
END
set @ScoreValue= @NumTricksBid * @MajorTrickValue +10
if (@ScoreValue < 100)
begin
set @ScoreValue= @TricksMade * @MajorTrickValue + 10 + @PartScoreBonus + @DoubledBonus + @ReDoubledBonus
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=0)
BEGIN
set @ScoreValue= @NumTricksBid * @MajorTrickValue + 20 + @PartScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueNV
END
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=1)
BEGIN
set @ScoreValue= @NumTricksBid * @MajorTrickValue + 20 + @PartScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueVul
END
end
else if (@ScoreValue >= 100)
begin
set @ScoreValue= @TricksMade * @MajorTrickValue + 10 + @GameScoreBonus + @DoubledBonus + @ReDoubledBonus
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=0)
BEGIN
set @ScoreValue= @NotrumpFirstTrickValue + ((@NumTricksBid - 1) * @MajorTrickValue) + @GameScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueNV
END
IF ((@Doubled=1 OR @ReDoubled=1) AND @DecVul=1)
BEGIN
set @ScoreValue= @NotrumpFirstTrickValue + ((@NumTricksBid - 1) * @MajorTrickValue) + @GameScoreBonus + @DoubledBonus + @ReDoubledBonus + (@TricksMade-@NumTricksBid)*@OvertrickValueVul
END
IF (@NumTricksBid=6)
BEGIN
set @ScoreValue= @ScoreValue + @SSlamBonus
END
IF (@NumTricksBid=7)
BEGIN
set @ScoreValue= @ScoreValue + @GSlamBonus
END
end
END
/*-=====================================---*/
/*- ---*/
/*- NOW for the failing contracts!!! ---*/
/*- ---*/
/*-=====================================*/
IF (@UnderTricks>0)
BEGIN
IF(@DecVul=0)
BEGIN
set @ScoreValue = @Under1NV + (@UnderTricks-1)*@Under2PlusNV
IF(@UnderTricks>3)
BEGIN
set @ScoreValue = @ScoreValue + (@UnderTricks-3)*@Under4PlusNV
END
RETURN @ScoreValue
END
ELSE IF(@DecVul=1)
BEGIN
set @ScoreValue = @Under1Vul + (@UnderTricks-1)*@Under2PlusVul
RETURN @ScoreValue
END
END
RETURN @ScoreValue
END
GO