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

Откуда: Самара
Сообщений: 232
Sql Server 2005

Есть несколько связанных пщ ID таблиц

tabl1 - поля p11,p12,p13

tabl2 - поля p21,p22,p23


Нужно - поле p11 таблицы tabl1 вычислять в зависимости от значения p12,p13 (tabl1) и значений p21,p22,p23 (tabl2)

Лучше Триггер ? Или как ?
16 сен 09, 08:05    [7664958]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле ?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
как часто будут обновляться (пересчитываться) данные? какой объём этих таблиц?
16 сен 09, 08:11    [7664969]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле ?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
по триггеру на обе таблицы - самое простое решение
16 сен 09, 08:16    [7664981]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле ?  [new]
alm2
Member

Откуда: Самара
Сообщений: 232
Knyazev Alexey
по триггеру на обе таблицы - самое простое решение



Данные в поле должны вычисляться в основном при добавлении новой записи в связанные таблицы (tabl1 и tabl2)

и редко при коррекции уже существующих записей


Приведите пример нужного мне триггера, пожалуйста
16 сен 09, 08:42    [7665047]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле ?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
alm2
Knyazev Alexey
по триггеру на обе таблицы - самое простое решение



Данные в поле должны вычисляться в основном при добавлении новой записи в связанные таблицы (tabl1 и tabl2)

и редко при коррекции уже существующих записей


Приведите пример нужного мне триггера, пожалуйста



издеваетесь? там одна строчка кода... не будьте уж на столько ленивы-откройте хелп
16 сен 09, 08:48    [7665061]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле ?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Knyazev Alexey
издеваетесь? там одна строчка кода... не будьте уж на столько ленивы-откройте хелп



use tempdb
create table t1 (id int, p11 int, p12 int, p13 int)
create table t2 (id int, p21 int, p22 int, p23 int)

create trigger tr1 on t1
for insert, update
as
update t1
set t1.p11=t.p12+t.p13+t2.p21+t2.p22+t2.p23
from inserted t inner join t2 on t.id=t2.id

create trigger tr2 on t2
for insert, update
as
update t1
set t1.p11=t1.p12+t1.p13+t.p21+t.p22+t.p23
from t1 inner join inserted t on t1.id=t.id

insert into t1
select 1, 1, 2, 3
union all
select 2, 1, 3, 4

insert into t2
select 1, 3, 4, 5
union all
select 2, 6, 7, 8

select * from t1
select * from t2

drop table t1
drop table t2
16 сен 09, 08:56    [7665091]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле ?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6722
C индексированным view:
USE tempdb

CREATE TABLE dbo.t1 (ID Int PRIMARY KEY,          p12 Int, p13 Int)
CREATE TABLE dbo.t2 (ID Int PRIMARY KEY, p21 Int, p22 Int, p23 Int)
GO
CREATE VIEW dbo.v1 WITH SCHEMABINDING AS
SELECT	 t1.ID
	,t1.p12 + t1.p13 + t2.p21 + t2.p22 + t2.p23	AS p11
--	,t1.p12
--	,t1.p13
--	,t2.p21
--	,t2.p22
--	,t2.p23
FROM	     dbo.t1
	JOIN dbo.t2 ON t1.id = t2.id
GO
CREATE UNIQUE CLUSTERED INDEX IX_v1 ON dbo.v1 (ID)
GO
INSERT	dbo.t1
SELECT	1,    2, 3
UNION ALL
SELECT	2,    3, 4

INSERT	dbo.t2
SELECT	1, 3, 4, 5
UNION ALL
SELECT	2, 6, 7, 8

SELECT * FROM dbo.t1
SELECT * FROM dbo.t2
SELECT * FROM dbo.v1

DROP VIEW  dbo.v1
DROP TABLE dbo.t1
DROP TABLE dbo.t2
Но много ограничений у подхода и текущую схему работы менять надо - обращаться к view.
16 сен 09, 10:05    [7665421]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле ?  [new]
alm2
Member

Откуда: Самара
Сообщений: 232
Knyazev Alexey
Knyazev Alexey
издеваетесь? там одна строчка кода... не будьте уж на столько ленивы-откройте хелп



use tempdb
create table t1 (id int, p11 int, p12 int, p13 int)
create table t2 (id int, p21 int, p22 int, p23 int)

create trigger tr1 on t1
for insert, update
as
update t1
set t1.p11=t.p12+t.p13+t2.p21+t2.p22+t2.p23
from inserted t inner join t2 on t.id=t2.id

create trigger tr2 on t2
for insert, update
as
update t1
set t1.p11=t1.p12+t1.p13+t.p21+t.p22+t.p23
from t1 inner join inserted t on t1.id=t.id

insert into t1
select 1, 1, 2, 3
union all
select 2, 1, 3, 4

insert into t2
select 1, 3, 4, 5
union all
select 2, 6, 7, 8

select * from t1
select * from t2

drop table t1
drop table t2



Спасибо

Я делаю так:
-----------------------------------
ALTER TRIGGER [dbo].[tr1]
ON [dbo].[proba1609]
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for trigger here
update proba1609 set proba1609.new= (select dbo.opr_paytype(a.paytype,zdog.tfoms,a.tolpu, lpu_sdc.vid_opl,2,4)
from inserted a, zdog, lpu_sdc ,proba1609
where a.id_pac=proba1609.id_pac and a.ndogovor=zdog.ndogovor and
a.lpuout=lpu_sdc.lpucode)

END
-------------------------


Примечание - функция dbo.opr_paytype возвращаеи одно значение

Для проверки :

Меняем значение:
update proba1609 set doctout=1 where id_pac=38

Смотрим результат:
select * from proba1609

Видим, что
В результате работы триггера- значение поля NEW устанавливается ПО ВСЕЙ таблице - а не в записи с ID_PAC=38

В чем моя ошибка ?
16 сен 09, 14:49    [7667778]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить