我正在尝试创建一个SQL Server用户定义函数(UDF),它计算得分并在表创建过程中应用该函数。
该表格包含以下列:
MemberID(PK)
Gender
Name
DOB
Weight
Height
SmokingHabit
Salary
CalculatedScore
计算得分是根据
以下各个人得分的总和计算出来的参数
年龄
体重(kg)/身高(m)
吸烟者
薪酬
我完全不知道如何编写代码,我已经开始使用
了CREATE FUNCTION [dbo].[FCupid]
(
@gender YES/NO,
@name varchar(15),
@dob datetime,
@weight int,
@height int,
@smoker Yes/NO,
@salary int
)
RETURNS @Member table
AS
BEGIN
INSERT @Member ( @gender, @name, @dob, @weight, @height, @smoker, @salary)
SELECT m.gender, m.dob, m.weight, m.height, m.smoker, m.salary,
然后我挣扎。
任何形式的帮助都将受到赞赏
答案 0 :(得分:0)
我会创建一个只将得分作为INT
返回的函数,如下所示:
CREATE FUNCTION [dbo].[FCupid]
(@gender CHAR(1), @name varchar(15), @dob datetime,
@weight int, @height int, @smoker BIT, @salary int)
RETURNS INT
AS
BEGIN
DECLARE @Score INT
-- determine age in years
DECLARE @Age INT
SELECT @Age = DATEDIFF(YEAR, @dob, GETDATE())
SELECT
@Score = CASE
WHEN @Age BETWEEN 20 AND 30 THEN 5
WHEN @Age BETWEEN 31 AND 40 THEN 4
WHEN @Age BETWEEN 41 AND 50 THEN 3
WHEN @Age > 50 THEN 2
ELSE 0
END
-- determine weight/height ratio - this should be **DECIMAL**, though - not INT !!
DECLARE @WeightHeight INT
SET @WeightHeight = @Weight / @height
SET
@Score = @Score +
CASE
-- what if that ratio is **below** 20 ???
WHEN @WeightHeight BETWEEN 20 AND 25 THEN 1
WHEN @WeightHeight BETWEEN 25 AND 30 THEN 3
WHEN @WeightHeight BETWEEN 30 AND 35 THEN 5
WHEN @WeightHeight BETWEEN 35 AND 40 THEN 2
ELSE 0
END
-- add five points if non-smoker
IF @Smoker = 0
SET @Score = @Score + 5
-- determine score by salary
SET
@Score = @Score +
CASE
WHEN @Salary < 50000 THEN 1
WHEN @Salary BETWEEN 50001 AND 60000 THEN 2
WHEN @Salary BETWEEN 60001 AND 70000 THEN 3
WHEN @Salary > 70000 THEN 4
END
RETURN @Score
END
这样,您可以使用手头的所有值调用此函数,并让它确定您可以根据需要用于插入表中的Score
另外作为旁注:我认为体重和身高应该是DECIMAL(10,2)
或类似的东西 - 而不是INT
。你怎么用INT
来表达1.86米的高度? 1?还是2?并且该比率的CASE
语句还应该处理其值低于20或超过40的情况 - 即使在该情况下它只是使用0作为分数(但应该明确定义)。
更新:如果要将数据插入表格,可以使用此功能:
INSERT INTO dbo.YourTable(Name, Gender, DateOfBirth, ...., Score)
SELECT
@Name, @Gender, @dob, .....,
dbo.FCupid(@Gender, @Name, @dob, .........)
基本上,您可以在SELECT
中调用此函数,就好像它是一个列(或多或少)