Sql 不允许在另一个计算列中使用计算列--如何允许它

Sql 不允许在另一个计算列中使用计算列--如何允许它,sql,sql-server,sql-server-2017,Sql,Sql Server,Sql Server 2017,在添加“等级”列时,我得到的错误是: Msg 1759,16级,状态0,第47行 表“tbl_Marks”中的计算列“Percentage”不允许在另一个计算列定义中使用 这是我的职责: ALTER TABLE tbl_marks DROP COLUMN Grade ALTER TABLE tbl_Marks ADD Grade AS dbo.fn_CalculateGrade(percentage) 我还尝试添加out函数,查询是: CREATE FUNCTION dbo.fn_Calcu

在添加“等级”列时,我得到的错误是:

Msg 1759,16级,状态0,第47行 表“tbl_Marks”中的计算列“Percentage”不允许在另一个计算列定义中使用

这是我的职责:

ALTER TABLE tbl_marks DROP COLUMN Grade

ALTER TABLE tbl_Marks ADD Grade AS dbo.fn_CalculateGrade(percentage)
我还尝试添加out函数,查询是:

CREATE FUNCTION dbo.fn_CalculateGrade(@Percentage DECIMAL)
RETURNS VARCHAR(10)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @Grade VARCHAR(10)
    SET @Grade = (CASE WHEN ISNULL(@Percentage,0) BETWEEN 60.00 AND 70.99 THEN 'D'
  WHEN ISNULL(@Percentage,0) BETWEEN 71.00 AND 80.99 THEN 'C'
  WHEN ISNULL(@Percentage,0) BETWEEN 81.00 AND 90.99 THEN 'B'
  WHEN ISNULL(@Percentage,0) BETWEEN 91.00 AND 100.00 THEN 'A' END)

    RETURN @Grade

END
GO

如何在没有任何错误的情况下实现这一点?

一种解决方法是直接将
S1-S5
作为参数传递,然后只计算函数中的百分比。事实上,我会避免使用用户定义的标量函数作为计算列:尤其是在2017年,因此它无法内联。考虑到它只是一个
CASE
表达式,您最好在列本身中定义它。是的,它正在工作,而不是“用户定义的标量函数”。我使用了“CASE”,我还强烈建议不要在这里使用函数。它看起来很漂亮,但由于种种原因,速度很慢@“即使在2019年,Larnu计算列也从未内联,看吧,我没说过会内联,@Charlieface。”。
CREATE FUNCTION dbo.fn_CalculateGrade(@Percentage DECIMAL)
RETURNS VARCHAR(10)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @Grade VARCHAR(10)
    SET @Grade = (CASE WHEN ISNULL(@Percentage,0) BETWEEN 60.00 AND 70.99 THEN 'D'
  WHEN ISNULL(@Percentage,0) BETWEEN 71.00 AND 80.99 THEN 'C'
  WHEN ISNULL(@Percentage,0) BETWEEN 81.00 AND 90.99 THEN 'B'
  WHEN ISNULL(@Percentage,0) BETWEEN 91.00 AND 100.00 THEN 'A' END)

    RETURN @Grade

END
GO
  UPDATE tbl_Marks SET Grade= (CASE WHEN ISNULL(Percentage,0) BETWEEN 60.00 AND 70.99 THEN 'D'
  WHEN ISNULL(Percentage,0) BETWEEN 71.00 AND 80.99 THEN 'C'
  WHEN ISNULL(Percentage,0) BETWEEN 81.00 AND 90.99 THEN 'B'
  WHEN ISNULL(Percentage,0) BETWEEN 91.00 AND 100.00 THEN 'A' END)