我是一名开始自学SQL / T-SQL的新手。我一直在使用SQL 2014 Express并尝试通过编写T-SQL脚本来完成所有工作。我这样做是为了帮助一个朋友用她正在编写的真人游戏的数据库,并且可以使用一些帮助来使以下用户定义的功能更加简化/以更正确的方式编写它。
我认为必要的功能本身是因为需要持续计算来确定项目的经济价值。这似乎是比尝试更新每个Items表更新时更新所有值的更新脚本更好的路径。对不起,如果这一切看起来都很简陋,那就试着去学习。
以下是代码。我有它工作,我已经在我的开发数据库中得到它,它做了它应该做的。但我想清理它,我不知道该怎么做。
CREATE FUNCTION dbo.ValueCalc (@itemid int)
RETURNS INT
AS
BEGIN
declare @rm1 int, @rm1amount int, @rm1value int,
@rm2 int, @rm2amount int, @rm2value int,
@rm3 int, @rm3amount int, @rm3value int,
@rm4 int, @rm4amount int, @rm4value int,
@cm1 int, @cm1amount int, @cm1value int,
@cm2 int, @cm2amount int, @cm2value int,
@cm3 int, @cm3amount int, @cm3value int,
@cm4 int, @cm4amount int, @cm4value int,
@productionvalue int;
select @rm1 = MatReqs.RM1 FROM MatReqs WHERE MatReqs.ItemId = @itemid;
select @rm1amount = MatReqs.RM1Amount FROM MatReqs WHERE MatReqs.ItemId = @itemid;
select @rm1value = RawMats.BaseValue FROM RawMats WHERE RawMats.RawMatId = @rm1;
if (@rm1 IS NULL) set @rm1=0;
if (@rm1amount IS NULL) set @rm1amount=0;
if (@rm1value IS NULL) set @rm1value=0;
{Repeat the above 3 more times, for rm2, rm3, and rm4}
select @cm1 = MatReqs.CM1 FROM MatReqs WHERE MatReqs.ItemId = @itemid;
select @cm1amount = MatReqs.CM1Amount FROM MatReqs WHERE MatReqs.ItemId = @itemid;
select @cm1value = Items.ProdValue FROM Items WHERE Items.ItemId = @cm1;
if (@cm1 IS NULL) set @cm1=0;
if (@cm1amount IS NULL) set @cm1amount=0;
if (@cm1value IS NULL) set @cm1value=0;
{same here, just removed the repetitions}
set @productionvalue = (@rm1amount * @rm1value)
+ (@rm2amount * @rm2value)
+ (@rm3amount*@rm3value)
+ (@rm4amount*@rm4value)
+ (@cm1amount*@cm1value)
+ (@cm2amount*@cm2value)
+ (@cm3amount*@cm3value)
+ (@cm4amount*@cm4value);
set @productionvalue = @productionvalue + (@productionvalue * .15);
return @productionvalue;
END
GO
答案 0 :(得分:0)
如果我有一些示例数据和您想要的结果以及您的整个功能,我可以编写一个更有效的解决方案,因为SQL Server针对基于集合的代码进行了优化,而您并没有真正使用它。就简单的清理而言,你可以做到这一点,但我宁愿你发布什么样本数据和期望的结果,而是让我为你提供一个好的基于集合的解决方案。
CREATE FUNCTION dbo.ValueCalc (@itemid INT)
RETURNS INT
AS
BEGIN
DECLARE @rm1 INT, @rm1amount INT, @rm1value INT,
@rm2 INT, @rm2amount INT, @rm2value INT,
@rm3 INT, @rm3amount INT, @rm3value INT,
@rm4 INT, @rm4amount INT, @rm4value INT,
@cm1 INT, @cm1amount INT, @cm1value INT,
@cm2 INT, @cm2amount INT, @cm2value INT,
@cm3 INT, @cm3amount INT, @cm3value INT,
@cm4 INT, @cm4amount INT, @cm4value INT,
@productionvalue INT;
--They both come from the same table with the where clause so just combine them
SELECT @rm1 = ISNULL(MatReqs.RM1,0),
@rm1amount = ISNULL(MatReqs.RM1Amount,0)
FROM MatReqs
WHERE MatReqs.ItemId = @itemid;
SELECT @rm1value = ISNULL(RawMats.BaseValue,0) F
FROM RawMats
WHERE RawMats.RawMatId = @rm1;
--The ISNULL() function will take care of this
--if (@rm1 IS NULL) set @rm1=0;
--if (@rm1amount IS NULL) set @rm1amount=0;
--if (@rm1value IS NULL) set @rm1value=0;
--Combine the first two statements again
SELECT @cm1 = ISNULL(MatReqs.CM1,0),
@cm1amount = ISNULL(MatReqs.CM1Amount,0)
FROM MatReqs
WHERE MatReqs.ItemId = @itemid;
SELECT @cm1value = ISNULL(Items.ProdValue,0)
FROM Items
WHERE Items.ItemId = @cm1;
--Again just use ISNULL
--if (@cm1 IS NULL) set @cm1=0;
--if (@cm1amount IS NULL) set @cm1amount=0;
--if (@cm1value IS NULL) set @cm1value=0;