SQL Server: вычисленный результат столбца, используемый в другом вычисляемом столбце

Я знаю, что невозможно вычислить столбец с учетом его вычислений другим вычисленным столбцом. Я обнаружил аппаратное обеспечение со следующей ошибкой:

"is not allowed to be used in another computed-column definition." 

Таким образом, у меня есть следующие столбцы данных, которые важны для arent, но просто для того, чтобы вы понимали, что я делаю (любые другие столбцы, на которые ссылаются, являются стандартными не вычисляемыми столбцами):

 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 

Любая помощь или совет оцениваются!

Эта ошибка is not allowed to be used in another computed-column definition. происходит, когда вы использовали вычисляемый столбец для вычисления другого значения столбца …

кажется, что у вас ниже расчетной колонки

HardwareAssetDepreciableValue

И тогда вы, используйте то же самое для вычисления ниже вычисленного столбца

 THEN CONVERT(DECIMAL(7,2),((HardwareAssetDepreciableValue / HardwareAssetLifeSpan) / 365)) 

вы не должны этого делать. Вместо этого вы должны использовать базовый расчет

но интересно, может ли кто-нибудь предложить или помочь с альтернативами для решения проблемы нескольких вычисляемых столбцов.

в настоящее время нет лучших альтернатив, одно решение, о котором я мог думать, – это взгляд на запрос базовой таблицы и использование уже существующих вычисляемых значений

Вычисленный столбец хорош для «one off» 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] 

APPEND

Поэтому, пытаясь подражать вашему примеру

 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 / THEN / CASE.

Вы могли ~ передавать в вычисленных столбцах новую функцию udfComputeHardwareAssetAccumulatedDepreciationValue.

Даже если вы новичок, вам следует потратить немного времени на борьбу с этой концепцией как на лучший инструмент, чтобы избежать RBAR / CURSORS.

Вы можете получить от Northwind db:

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Да, из него могут быть созданы его очень старые, но простые демо.

вы можете сделать оба столбца определенными пользователем функциями, я искал его, но, наконец, получил, функция может получить доступ ко всем столбцам, вычисленным ND NON Computed …

Спасибо

Interesting Posts

Строки разделения SQL

Как предоставить доступ к данным из базы данных?

Как получить определенные строки во внутреннем соединении SQL

Ошибка преобразования при изменении поля datetime

Получить последние экземпляры внешнего ключа

SQL Server IN (Выбрать) приводит к завершению запроса

Экранирование escape-символа не работает – SQL LIKE Operator

Почему мое веб-приложение ASP.NET / SQL Server падает при возобновлении после периода бездействия?

Создание резервной копии базы данных SQL Server

Как получить вставленную идентификацию при миграции FluentMigrator

SQL Server FOR XML

SQL Server Отключение всех триггеров – не удается найти объект «XXXX», потому что он не существует или у вас нет разрешений

Лучший инструмент GUI для документирования базы данных SQL Server

Выбор отдельных значений из таблицы с использованием двух столбцов

Просмотр кластеризованного индекса Искать более 0,5 миллиона строк занимает 7 минут

Давайте будем гением компьютера.