【问题标题】:Computed column through scalar function error通过标量函数错误计算列
【发布时间】:2020-06-01 15:09:04
【问题描述】:

这个问题与user-defined scalar function to generate computed column有关

ALTER TABLE dbo.Installment  
ADD SurchargeCalculated AS 
   (select Amount * Days * InstSurchargePercentage / 365 / 100
    from InstallMentPlan 
    where InstallMentPlan.PlanKey = Installment.PlanKey
   )
GO

错误是:

消息 1046,第 15 级,状态 1,第 3 行
在这种情况下不允许子查询。只允许使用标量表达式。

【问题讨论】:

  • 然而,标量函数往往会影响性能(注意,我不能在 SQL Server 2019 的计算列上使用它的内联功能来代表它们)并且可以导致竞争条件。这似乎更适合VIEW 或类似名称。

标签: sql sql-server tsql


【解决方案1】:

您不能对计算列执行此操作:它只能引用来自同一表和同一行的列。

作为一种解决方法,您可以定义一个视图:

create view dbo.InstallmentView as
select 
    i.*,
    (
        select p.Amount * p.Days * p.InstSurchargePercentage / 365 / 100
        from dbo.InstallMentPlan p
        where p.PlanKey = i.PlanKey
    ) SurchargeCalculated 
from  dbo.Installment i

这也可以用join表示:

create view dbo.InstallmentView as
select 
    i.*,
    p.Amount * p.Days * p.InstSurchargePercentage / 365 / 100 SurchargeCalculated 
from  dbo.Installment i
left join dbo.InstallMentPlan p on p.PlanKey = i.PlanKey

请注意,您应该枚举要从dbo.Installment 中选择的列,而不是使用*(我这样做只是因为我不了解您的数据库结构)。

【讨论】:

  • 非常感谢您的回复...它现在抛出此错误...消息 207,级别 16,状态 1,过程 InstallmentView,第 6 行无效的列名称“PlanKey”。消息 207,级别 16,状态 1,过程 InstallmentView,第 6 行无效的列名称“PlanKey”。
  • @khawarabbasi: 好吧,你在dbo.Installmentdbo.InstallMentPlan 表中有一个名为PlanKey 的列吗?我是从您的原始查询中得出的。
  • 我在分期付款表中有这些列 ,[PlotId] ,[MemberId] ,[PlotFileId] ,[InstallmentNo] ,[InstallmentOrder] ,[Amount] ,[DueDate] ,[AmountPaid] ,[PaidOn ] ,[Surcharge] ,[Comments] ,[ModifiedOn] ,[SyncState] ,[SurchargePaid] ,[SurchargePaidOn] ,[PartialInstallmentId] ,[InstPlanDetailId] ,[days] ,[Is_Lumpsum]
  • 和InstallmentPlan col=> [SizeId] ,[PhaseId] ,[BlockId] ,[PlanName] ,[TotalCost] ,[DownPayment] ,[NoOfInstallment] ,[InstallmentAmount] ,[StartDate] ,[ ModifiedOn] ,[DownPaymentDueDate] ,[InstallmentDurationMonth] ,[DPSurchargeAmount] ,[DPSurchargePercentage] ,[InstSurchargeAmount] ,[InstSurchargePercentage] ,[InstSurchargeDueMonth] ,[DueDateAdjustment] ,[LumsumDiscount] ,[LumsumDiscountDueDate]
  • @khawarabbasi:在您的原始查询中,两个表中都有一个名为PlanKey 的列,因此我将其用作连接条件。如果这不正确,那么您需要将其更改为相关列。我不知道可以使用哪些列(这是您的数据库!)。
猜你喜欢
  • 2015-02-08
  • 2017-06-15
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多