Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сложное вычисляемое поле  [new]
Kolfer
Member

Откуда:
Сообщений: 3
Необходимо сделать вычисляемое поле.В этой таблице у меня есть 3 FK содержащие код услуги,стоимость которой записана в другой таблице,также есть и 4 fk,опирающийся на другую таблицу.
Прикладываю скрин.
Вычисляемое поле Permit.Result ,а мои fk это iclude1, iclude2, iclude3, MoreInc,Они каким то методом должны брать числа из полей price таблиц ServiceInclude и MoreInclude.
Помогите,если знаете.

К сообщению приложен файл. Размер - 13Kb
20 дек 16, 21:42    [20029462]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
FRoST86
Member

Откуда:
Сообщений: 121
Kolfer
Необходимо сделать вычисляемое поле.


Задача в чем?
Создать вычисляемое поле или вычислить?
21 дек 16, 09:35    [20030334]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Kolfer
,Они каким то методом должны брать числа из полей price таблиц ServiceInclude и MoreInclude.
Помогите,если знаете.


Почитайте про Join
21 дек 16, 09:40    [20030356]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
Sybex
Member

Откуда: Moscow
Сообщений: 113
Вычисляемое поле сделать не получится. Вычисляемые поля могут быть сделаны только по данным, хранящимся в той же строке той же самой таблицы. Если Вам нужно сделать поле, которое будет хранить результат вычислений, затрагивающих другие таблицы, то нужно создавать триггеры. Ну или просто в запросе выбирать.
21 дек 16, 10:24    [20030607]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Kolfer,

VIEW
21 дек 16, 10:30    [20030646]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31440
Sybex
Вычисляемое поле сделать не получится. Вычисляемые поля могут быть сделаны только по данным, хранящимся в той же строке той же самой таблицы.
Ну, можно функцию сделать.
Но в данном случае нужно всё таки уточнить, что требуется. Потому что под "вычисляемое поле" люди иногда понимают необходимость сделать простой апдэйт обычного поля, или вычислить результат в запросе...
21 дек 16, 10:42    [20030705]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Sybex
Вычисляемые поля могут быть сделаны только по данным, хранящимся в той же строке той же самой таблицы.
Да ладно!
Берусь создать поле, вычисляющее по данным в другой таблице.
Только оно будет тормозить, ведь будет вычислять для каждой строки даже при любом SELECTе.
21 дек 16, 10:45    [20030723]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap
Sybex
Вычисляемые поля могут быть сделаны только по данным, хранящимся в той же строке той же самой таблицы.
Да ладно!
Берусь создать поле, вычисляющее по данным в другой таблице.
Только оно будет тормозить, ведь будет вычислять для каждой строки даже при любом SELECTе.

даже не начинайте показывать как, а то это всё в продакшн улетит :) это как имя которое нельзя называть
21 дек 16, 10:48    [20030750]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Kolfer,

представление данных создайте.
21 дек 16, 11:05    [20030876]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
Kolfer
Member

Откуда:
Сообщений: 3
alexeyvg, Апдейт обычного поля,что бы в поле Result была стоимость всех основных услуг и одной дополнительной,вместо нулей

К сообщению приложен файл. Размер - 16Kb
21 дек 16, 15:20    [20032460]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
Sybex
Member

Откуда: Moscow
Сообщений: 113
Kolfer, вам это поле для каких целей нужно?
Просто то, что в SQL Server называется "вычисляемым полем" имеет определённые ограничения, а именно для вычисления значения этого поля можно использовать только те данные, которые доступны в этой же строке. Никаких данных из других таблиц подтянуть не получится. Но поле, значение которого будет вычисляться на основе данных из других таблиц, сделать можно. Только придётся потрудится. Есть несколько вариантов решения этого вопроса, их вам перечислили. Выбор зависит от того, что вы планируете с этим полем делать.
Например, если вы планируете его просто отображать, особенно для ограниченного количества записей за раз, то проще всего будет сделать представление (VIEW) и работать с ним. Если это поле вводится для повышения производительности (скорее всего не ваш случай), то там уже более серьёзная реализация. Для этого нужно будет сделать обычное поле и триггеры (как для таблицы с полем, так и для связанных таблиц), которые будут обновлять его значение.
21 дек 16, 17:29    [20033194]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Sybex
Kolfer, вам это поле для каких целей нужно?
Просто то, что в SQL Server называется "вычисляемым полем" имеет определённые ограничения, а именно для вычисления значения этого поля можно использовать только те данные, которые доступны в этой же строке. Никаких данных из других таблиц подтянуть не получится. Но поле, значение которого будет вычисляться на основе данных из других таблиц, сделать можно. Только придётся потрудится. Есть несколько вариантов решения этого вопроса, их вам перечислили. Выбор зависит от того, что вы планируете с этим полем делать.
Например, если вы планируете его просто отображать, особенно для ограниченного количества записей за раз, то проще всего будет сделать представление (VIEW) и работать с ним. Если это поле вводится для повышения производительности (скорее всего не ваш случай), то там уже более серьёзная реализация. Для этого нужно будет сделать обычное поле и триггеры (как для таблицы с полем, так и для связанных таблиц), которые будут обновлять его значение.
Так и не понял, в курсе вы о возможности сделать обычное поле, вычисляемое из других таблиц...
Я тут по дороге домой ещё подумал, что и сам был неточен.
Это поле же можно объявить PERSISTED. Тогда значения будут храниться и пересчитываться по необходимости.
21 дек 16, 18:30    [20033448]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap
Sybex
Kolfer, вам это поле для каких целей нужно?
Просто то, что в SQL Server называется "вычисляемым полем" имеет определённые ограничения, а именно для вычисления значения этого поля можно использовать только те данные, которые доступны в этой же строке. Никаких данных из других таблиц подтянуть не получится. Но поле, значение которого будет вычисляться на основе данных из других таблиц, сделать можно. Только придётся потрудится. Есть несколько вариантов решения этого вопроса, их вам перечислили. Выбор зависит от того, что вы планируете с этим полем делать.
Например, если вы планируете его просто отображать, особенно для ограниченного количества записей за раз, то проще всего будет сделать представление (VIEW) и работать с ним. Если это поле вводится для повышения производительности (скорее всего не ваш случай), то там уже более серьёзная реализация. Для этого нужно будет сделать обычное поле и триггеры (как для таблицы с полем, так и для связанных таблиц), которые будут обновлять его значение.
Так и не понял, в курсе вы о возможности сделать обычное поле, вычисляемое из других таблиц...
Я тут по дороге домой ещё подумал, что и сам был неточен.
Это поле же можно объявить PERSISTED. Тогда значения будут храниться и пересчитываться по необходимости.

не даст.. если вы про функцию детерминированность и всё такое
21 дек 16, 18:32    [20033457]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
TaPaK
iap
пропущено...
Так и не понял, в курсе вы о возможности сделать обычное поле, вычисляемое из других таблиц...
Я тут по дороге домой ещё подумал, что и сам был неточен.
Это поле же можно объявить PERSISTED. Тогда значения будут храниться и пересчитываться по необходимости.

не даст.. если вы про функцию детерминированность и всё такое
Само собой надо выполнить определённые требования.
И что, всё равно не даст?
Я так далеко в этом деле ещё не заходил... Хватает других возможных решений.
21 дек 16, 18:42    [20033490]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap
TaPaK
пропущено...

не даст.. если вы про функцию детерминированность и всё такое
Само собой надо выполнить определённые требования.
И что, всё равно не даст?
Я так далеко в этом деле ещё не заходил... Хватает других возможных решений.

если типа
автор
CREATE FUNCTION [dbo].[calcSection](@Id INT)
RETURNS MONEY
AS
BEGIN
RETURN
(
SELECT SUM(Section * 500)
FROM a2
WHERE
Id = @Id
)
END

ALTER TABLE a1 ADD [Calculate_Presisted] AS dbo.calcSection(Id) PERSISTED
Computed column 'Calculate_Presisted' in table 'a1' cannot be persisted because the column is non-deterministic.
но я особо дальше не пробовал, нафиг не надо :)
21 дек 16, 18:46    [20033508]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
TaPaK
iap
пропущено...
Само собой надо выполнить определённые требования.
И что, всё равно не даст?
Я так далеко в этом деле ещё не заходил... Хватает других возможных решений.

если типа
автор
CREATE FUNCTION [dbo].[calcSection](@Id INT)
RETURNS MONEY
AS
BEGIN
RETURN
(
SELECT SUM(Section * 500)
FROM a2
WHERE
Id = @Id
)
END

ALTER TABLE a1 ADD [Calculate_Presisted] AS dbo.calcSection(Id) PERSISTED
Computed column 'Calculate_Presisted' in table 'a1' cannot be persisted because the column is non-deterministic.
но я особо дальше не пробовал, нафиг не надо :)
Как минимум, надо привязать функцию к схеме.
21 дек 16, 19:28    [20033700]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
iap
И что, всё равно не даст?
Не даст. Любое обращение к таблицам делает функцию недетерминированной.
21 дек 16, 19:42    [20033751]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
Sybex
Member

Откуда: Moscow
Сообщений: 113
iap
И что, всё равно не даст?

Про детерминированность уже сказали, так что тут добавить нечего.

Можно только хорошенько задуматься над тем, почему так сделано. Для этого достаточно задаться вопросом, что должен делать движок SQL Server'а в том случае, когда во второй таблице (в которой кол-во строк вычисляется) изменится это самое количество или значение в полях, участвующих в вычислениях. Как движок будет это обрабатывать для нашего вычисляемого столбца? Т.е. при каждом изменении строк во второй таблице нужно будет заново вычислять столбцы в первой? А если таких строк не одна? А если там по нескольким таблицам идёт вычисление? Если над этим хорошо подумать, то становится понятно, почему функция для вычисляемого столбца должна быть обязательно детерминированной, т.е. возвращающей всегда один и тот же результат при одних и тех же входных параметрах.

Так что "вычисляемый столбец" (в понимании особого вида столбца таблицы, а не просто вычисленного поля обновляемого клиентом или триггерами или ещё как-то вручную) может использовать для вычисления только те данные, которые доступны в одной строке и обрабатывать эти данные только детерминированными функциями.
23 дек 16, 14:17    [20041738]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap
TaPaK
пропущено...

если типа
пропущено...

ALTER TABLE a1 ADD [Calculate_Presisted] AS dbo.calcSection(Id) PERSISTED
Computed column 'Calculate_Presisted' in table 'a1' cannot be persisted because the column is non-deterministic.
но я особо дальше не пробовал, нафиг не надо :)
Как минимум, надо привязать функцию к схеме.

да хоть к стене прибить :)
23 дек 16, 14:21    [20041768]     Ответить | Цитировать Сообщить модератору
 Re: Сложное вычисляемое поле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
в итоге приходим к ограничению UserDataAccess

https://msdn.microsoft.com/en-us/library/ms186755.aspx
автор
A computed column that invokes a user-defined function can be used in an index when the user-defined function has the following property values:
IsDeterministic = true
IsSystemVerified = true (unless the computed column is persisted)
UserDataAccess = false
SystemDataAccess = false
23 дек 16, 14:43    [20041889]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить