Sql 通过标量函数计算列错误

Sql 通过标量函数计算列错误,sql,sql-server,tsql,Sql,Sql Server,Tsql,这个问题是关于 错误是: 味精1046,第15级,状态1,第3行 在此上下文中不允许子查询。只允许使用标量表达式 不能对计算列执行此操作:它可能只引用同一表和同一行中的列 作为解决方法,您可以定义一个视图: create view dbo.InstallmentView as select i.*, ( select p.Amount * p.Days * p.InstSurchargePercentage / 365 / 100 from db

这个问题是关于

错误是:

味精1046,第15级,状态1,第3行
在此上下文中不允许子查询。只允许使用标量表达式


不能对计算列执行此操作:它可能只引用同一表和同一行中的列

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

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
这也可以用连接表示:

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.instance
中枚举要选择的列,而不是使用
*
(我这样做只是因为我不了解您的数据库结构)。

您不能使用计算列执行此操作:它可能只引用同一表和同一行中的列

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

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
这也可以用连接表示:

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.instance
中枚举要选择的列,而不是使用
*
(我这样做只是因为我不了解您的数据库结构)。

但是,标量函数往往会影响性能(注意,我不能用SQL Server 2019中的内联功能在计算列上为它们说话)并可能导致竞争条件。这似乎是
视图
或类似视图的更好选择。但是,标量函数往往会影响性能(注意,在SQL Server 2019的计算列上,我无法用它的内联功能为它们说话)并且可能导致竞争条件。对于
视图
或类似视图,这似乎是一个更好的候选者。非常感谢您的回复…它现在抛出此错误…Msg 207,级别16,状态1,过程安装视图,第6行无效列名“PlanKey”。Msg 207,级别16,状态1,过程安装视图,第6行无效列名“Pl”anKey.@Khawarabasi:嗯,在表
dbo.installation
dbo.installamentplan
中有一个名为
PlanKey
的列吗?我是从您最初的查询中得到的。我在分期表中有这些列,[PlotId],[MemberId],[PlotFileId],[installationno],[InstallmentOrder],[Amount],[DueDate]、[AmountPaidon]、[AmountPaidon]、[Oversage]、[SyncState]、[SurchargePaidOn]、[PartialInstallId]、[InstPlanDetailId]、[days]、[Is_Lumpsum]和InstallmentPlan col=>[SizeId]、[PhaseId]、[BlockId],[PlanName]、[TotalCost]、[Downpay]、[NoofInstallation]、[InstallmentAmount]、[StartDate]、[ModifiedOn]、[DownPaymentDueDate]、[InstallmentDurationMonth]、[DPSurchargeAmount]、[DPSurchargePercentage]、[InstrchargeAmount]、[InstrchargePercentage],[仪器附加费到期月],[到期日调整],[每月折扣],[每月折扣到期日]@Khawarabasi:在您最初的查询中,两个表中都有一个名为
PlanKey
的列,因此我将其用作联接条件。如果这不正确,则需要将其更改为相关列。我无法确定可以使用哪些列(这是您的数据库!)。非常感谢您的回复…它现在抛出了这个错误…Msg 207,级别16,状态1,过程安装视图,第6行无效列名“PlanKey”。Msg 207,级别16,状态1,过程安装视图,第6行无效列名“PlanKey”。@Khawarabasi:那么,在表
dbo.Installme中有一个名为
PlanKey
的列吗nt
dbo.InstallMentPlan
?我从您的原始查询中获取。我在分期付款表中有这些列,[PlotId]、[MemberId]、[PlotFileId]、[InstallmentNo]、[InstallmentOrder]、[Amount]、[DueDate]、[AmountPaidon]、[Overload]、[Comments]、[ModifiedOn],[SyncState],[SurchargePaidOn],[PartialInstallmentId],[InstPlanDetailId],[days],[Is_Lumpsum]和InstallmentPlan col=>[SizeId],[PhaseId],[BlockId],[PlanName],[TotalCost],[Downpaidon],[NoofInstallation],[InstallmentAmount],[StartDate]、[ModifiedOn]、[DownPaymentDueDate]、[InstallmentDurationMonth]、[DPSurchargeAmount]、[DPSurchargePercentage]、[InstSurchargeAmount]、[InstSurchargePercentage]、[InstSurchargeDueMonth]、[DueDate Adjustment]、[LumSumSumSum折扣]、[LumSumSum折扣DueDate]@Khawarabasi:在您最初的查询中,两个表中都有一个名为
PlanKey
的列,因此我将其用作联接条件。如果这不正确,则需要将其更改为相关列。我无法确定可以使用哪些列(这是您的数据库!)。