我知道不可能让一个计算列考虑到它的计算,另一个计算列。我发现硬件有以下错误:
"is not allowed to be used in another computed-column definition."因此,我有以下数据列,这些列不一定重要,但只是为了让您了解我在做什么(所引用的任何其他列都是标准的非计算列):
HardwareAssetDepreciableValue AS CONVERT(DECIMAL(7,2),HardwareAssetPurchaseValue -
HardwareAssetSalvageValue)
HardwareAssetLifeSpan AS CONVERT(DECIMAL(6,2),DATEDIFF(day,HardwareAssetDateInstalled,
HardwareAssetEndOfLifeDate)) / 365它们都是按预期计算和工作的,不过,我遇到的问题最多是一组相当复杂的计算,但想知道是否有人可以建议或帮助解决多个计算列的问题。
我的问题是:
HardwareAssetAccumulatedDepreciationValue AS CASE WHEN HardwareAssetDepreciationMethodID
= '1' THEN CONVERT(DECIMAL(7,2),((HardwareAssetDepreciableValue / HardwareAssetLifeSpan)
/ 365)) WHEN HardwareAssetDepreciationMethodID = '2' THEN CONVERT(DECIMAL(7,2),
HardwareAssetAccumulatedDepreciationValue + ((1.5 *(1/HardwareAssetLifeSpan))*
HardwareAssetBookValue)/365) ELSE CONVERT(DECIMAL(7,2),
HardwareAssetAccumulatedDepreciationValue + ((2 *(1/HardwareAssetLifeSpan))
*HardwareAssetBookValue)/365) END任何帮助或建议都是非常感谢的!
发布于 2017-02-17 15:27:12
当您使用计算列计算另一列值时,会发生此错误is not allowed to be used in another computed-column definition.。
似乎你有下面的计算列
HardwareAssetDepreciableValue
然后,使用相同的方法计算下面的计算列。
THEN CONVERT(DECIMAL(7,2),((HardwareAssetDepreciableValue / HardwareAssetLifeSpan)
/ 365))你不应该像that..instead那样做,你应该使用基计算
但是想知道是否有人可以建议或帮助解决多个计算列的问题。
目前,没有更好的替代方案,我可以想到的一个解决方案是查询基表并使用已经存在的计算值。
发布于 2017-02-17 15:35:55
计算列对于“一次性”IMHO是好的。
对于有点复杂的东西,我喜欢创建一个标量用户定义的函数,并在其中包装“迷你逻辑”。
下面是一个简单的Northwind示例。它没有太多的实际意义,但证明了。
现在,我不喜欢下面的udfExampleUdfTwoDoubleUdfOne想法。但它可能对你有用。
这是一个工具库的想法。这是因为你要求有其他的想法。
Use Northwind
GO
create function dbo.udfExampleUdfOne(@OrderID as int, @ProductID int, @UnitPrice money )
returns int
as
begin
declare @returnValue int = 0
select @returnValue = ISNULL(@OrderID,0) + ISNULL(@ProductID,0) + ISNULL(@UnitPrice,0)
return @returnValue;
end;
GO
create function dbo.udfExampleUdfTwoDoubleUdfOne(@udfOneResult int)
returns int
as
begin
declare @returnValue int = 0
select @returnValue = ISNULL(@udfOneResult,0) * 2
return @returnValue;
end;
GO
SELECT TOP 1000 [OrderID]
,[ProductID]
,[UnitPrice]
,[Quantity]
,[Discount]
, MyValueOne = dbo.udfExampleUdfOne(OrderID , ProductID , UnitPrice)
, MyValueTwoWhichIsActuallyDoubleValueOne = dbo.udfExampleUdfTwoDoubleUdfOne(dbo.udfExampleUdfOne(OrderID , ProductID , UnitPrice))
FROM [Northwind].[dbo].[Order Details]附文
所以试着模仿你的例子
create function dbo.udfComputeHardwareAssetDepreciableValue(@HardwareAssetPurchaseValue int, @HardwareAssetSalvageValue int )
returns int
as
begin
declare @returnValue int = 0
select @returnValue = ISNULL(@HardwareAssetPurchaseValue,0) - ISNULL(@HardwareAssetSalvageValue,0)
return @returnValue;
end;
create function dbo.udfComputeHardwareAssetLifeSpan(@HardwareAssetDateInstalled int, @HardwareAssetEndOfLifeDate int )
returns int
as
begin
declare @returnValue int = 0
select @returnValue = CONVERT(DECIMAL(6,2),DATEDIFF(day,@HardwareAssetDateInstalled,
@HardwareAssetEndOfLifeDate)) / 365
return @returnValue;
end;然后编写第三个UDF,它封装了您的HardwareAssetAccumulatedDepreciationValue IF/IF/CASE逻辑。
您也可以将计算过的列传递到新的函数中。
即使你是新来的,你也应该花点时间在这个概念上挣扎,因为它是最好的避免RBAR/游标的工具。
你可以从这里得到北风分局:
https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx
是的,它很古老,但它可以创建简单的演示。
发布于 2017-02-20 06:45:05
您可以使两个列的用户定义函数,我正在寻找它,但最终得到,该函数可以访问所有列计算和非计算.
谢谢
https://stackoverflow.com/questions/42301365
复制相似问题