Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: триггер (вычис. столб.)  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Насколько смог понять задачу:
create trigger dbo.tInsert on dbo.Jurnal
instead of insert
as
begin
 if @@rowcount = 0
  return;
 
 set nocount on;
 
 insert into dbo.Jurnal
  (kod, field1, field2, ..., fieldN, KodT)
  select
   i.kod, i.field1, i.field2, ..., i.fieldN, isnull(t.KodT, 0) + 1
  from
   inserted i outer apply
   (select top (1) KodT from dbo.Jurnal where KodAB = i.KodAB and Price = i.Price order by KodT desc) t;
end;

Как, при многопользовательской работе, избежать дедлоков и вставок одинаковых KodT разными сессиями, изучайте самостоятельно.
3 дек 11, 13:26    [11700667]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
ща попробуем, а на счет "apply"-спс) я(малограмотный) не знал о существование этого оператора
invm
Насколько смог понять задачу:
Как, при многопользовательской работе, избежать дедлоков и вставок одинаковых KodT разными сессиями, изучайте самостоятельно.
3 дек 11, 14:03    [11700727]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
а поле Kod-int identity, нам доступно его значение при вставке если insert of?ZVER-10,
3 дек 11, 14:13    [11700736]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
сорри, если instead of
3 дек 11, 14:15    [11700739]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ZVER-10
а поле Kod-int identity, нам доступно его значение при вставке если insert of?ZVER-10,
Поле со свойством IDENTITY в inserted всегда равно NULL.

С осторожностью используйте @@ROWCOUNT в триггерах для версий >=2008.
Это может плохо кончится в MERGE.
Лучше COUNT(*) FROM inserted
3 дек 11, 18:46    [11701376]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
ZVER-10
а поле Kod-int identity, нам доступно его значение при вставке если insert of?ZVER-10,
Поле со свойством IDENTITY в inserted всегда равно NULL.
Недописал, что это относится к триггеру INSTEAD OF INSERT
3 дек 11, 18:47    [11701378]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Нееееееесмог. Может я не правильно объясняю –чего хочу…попробую еще раз.
есть табл. Jurnal(Kod int-счетчик ,KodAB-int,KodT-int,Price-float). KodT –вычисляется след образом: если в таблице есть запись которая KodAB и Price(старые записи)= KodAB и Price (вставляемой строкой), то KodT(вставляемая строка)= KodT (старые записи)+1 иначе KodT(вставляемая строка)= 1. В табл. может быть несколько таких совпадение, нужно брать тот который записан в табл. последним

create Table Jurnal(Kod int identity, KodAB int,KodT int,DataAdd datetime,Price float);
go

insert into Jurnal(KodAB,KodT,DataAdd,Price)
select 2,0,2/2/2222,10
union all
select 2,0,2/2/2222,10
union all 
select 2,0,2/2/2222,10
union all 
select 2,0,2/2/2222,5

go

insert into Jurnal(KodAB,KodT,DataAdd,Price)
select 2,0,2/2/2222,10
union all
select 2,0,2/2/2222,10
union all 
select 2,0,2/2/2222,10
union all 
select 2,0,2/2/2222,5

Результат после первого ИНСЕРТа должен быть:
kod KodAB KodT DataAdd Price
1 2 1 2/2/2222 10
2 2 2 2/2/2222 10
3 2 3 2/2/2222 10
4 2 1 2/2/2222 5

А после второго:
kod KodAB KodT DataAdd Price
1 2 1 2/2/2222 10
2 2 2 2/2/2222 10
3 2 3 2/2/2222 10
4 2 1 2/2/2222 5
5 2 4 2/2/2222 10
6 2 5 2/2/2222 10
7 2 6 2/2/2222 10
8 2 2 2/2/2222 5
5 дек 11, 08:32    [11704634]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
up
5 дек 11, 10:02    [11704886]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
у меня сервер 2005 , если что
5 дек 11, 10:36    [11705128]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
up!
5 дек 11, 12:49    [11706126]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
up!
5 дек 11, 15:16    [11707495]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
up!
5 дек 11, 15:22    [11707533]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
нарооооооооооооооод , хеееееееееелп
5 дек 11, 15:57    [11707884]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
USE tempdb
GO
CREATE TABLE dbo.Journal (
	 ID		Int	IDENTITY
	 CONSTRAINT [PK_Journal]		PRIMARY KEY
	,[Type]		Int		NOT NULL
	,Created	DateTime	NOT NULL
	 CONSTRAINT [DF_Fournal_Created]	DEFAULT (GetDate())
	,Price		Money		NOT NULL	-- За Float в деньгах вешают на рее, за яйца.
)							-- Используй Decimal, Люк
GO
INSERT	dbo.Journal	([Type],Price)	-- Пишите схему (dbo) всегда
		SELECT	1,10
UNION ALL	SELECT	1,10
UNION ALL	SELECT	1,10
UNION ALL	SELECT	1, 5

INSERT	dbo.Journal	([Type],Price)
		SELECT	1,10
UNION ALL	SELECT	1,10
UNION ALL	SELECT	1,10
UNION ALL	SELECT	1, 5
GO
SELECT	 ID
	,[Type]
	,Row_Number()OVER(PARTITION BY [Type], Price ORDER BY Created)	AS [Order]
	,Created
	,Price
FROM	dbo.Journal
ORDER BY ID
GO
DROP TABLE dbo.Journal
IDTypeOrderCreatedPrice
1112011-12-05 14:13:34.08010.00
2122011-12-05 14:13:34.08010.00
3132011-12-05 14:13:34.08010.00
4112011-12-05 14:13:34.0805.00
5142011-12-05 14:13:34.08010.00
6152011-12-05 14:13:34.08010.00
7162011-12-05 14:13:34.08010.00
8122011-12-05 14:13:34.0805.00
5 дек 11, 16:18    [11708136]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Mnior
а где триггер?
5 дек 11, 17:56    [11709195]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
ZVER-10
а где триггер?
А зачем?
5 дек 11, 18:13    [11709326]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Mnior
ZVER-10
а где триггер?
А зачем?
я ставлю строки из приложений, кодТ не задам. сервер сам вставит значение кодТ?
5 дек 11, 18:27    [11709399]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
все тема закрыта. всем спс-огромное, особенно красавице которая решила
CREAT trigger [tInsert] on [dbo].[Jurnal]
after insert
as
begin
	
	update
		J
	set
		KodT = JN.KodT		
	from
		Jurnal J
		inner join (
			select
				 I.Kod
				,isnull(J.max_kodt,0) + row_number()over(partition by I.KodAB, I.Price order by I.Kod) as KodT
			from
				inserted I
				left join (
					select
						 KodAB
						,Price
						,max(KodT) max_kodt
					from
						Jurnal
					group by
						 KodAB
						,Price				
				) J on	I.KodAB = J.KodAB
					and	I.price = J.price
		) JN  on	J.Kod = JN.Kod			
	
end
5 дек 11, 18:41    [11709473]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
ZVER-10
я ставлю строки из приложений, кодТ не задам. сервер сам вставит значение кодТ?
Ну дык, вы запрос то видели? Нет в таблице не нужной колонки. Если надо в каком-то запросе, вот вам и показали.

В итоге опять сделано через ЗДЦ.
13 дек 11, 12:06    [11755221]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Mnior
Ну дык, вы запрос то видели? Нет в таблице не нужной колонки. Если надо в каком-то запросе, вот вам и показали.

В итоге опять сделано через ЗДЦ.

что-то я не догнал, что вы хотели сказать. объясните подробнее пжл.
17 дек 11, 17:15    [11782618]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Mnior
Ну дык, вы запрос то видели? Нет в таблице не нужной колонки. Если надо в каком-то запросе, вот вам и показали.

В итоге опять сделано через ЗДЦ.
все все все. понял. спс)
19 дек 11, 18:30    [11791491]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
приветы, добавились поля и поменялась логика.вот таблица:
+
CREATE TABLE dbo.Jurnal(
	Kod int IDENTITY(1,1) NOT NULL,
	KodT int NULL,
	KodAB int NOT NULL,
	Price decimal(18, 2)NOT NULL ,
	Srok datetime NULL,
	SerNumber char(50) NULL)

теперь при вставке, вычисляем KodT след образом: ищем совпадение по след.полям. KodAB,Price,Srok,SerNumber. если нету такого, тогда установим max(KodT)+1
повесил вот такой триггер:
+
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER trigger [tr_Insert] on [dbo].[Jurnal]
after insert
as
BEGIN
SET NOCOUNT ON

declare @Jurnal table(
	 Kod		int	primary key not null
	,KodT		int
	,KodAB		int
	,Price		decimal(18,2)	
	,Srok		datetime
	,SerNumber	char(50)
) 
--------------------------------------------------
insert @Jurnal (
	 Kod	
	,KodT
	,KodAB
	,Price	
	,Srok
	,SerNumber
)
select
	 Kod
	,KodT
	,KodAB
	,Price
	,Srok
	,SerNumber
from
	inserted
---------------------------------------------------------------------------------------


declare @next_kod	int

	while exists(select * from @Jurnal)
	BEGIN
---------------------------------------------------------------------------------------		
		select
			@next_kod = min(kod)
		from
			@Jurnal
---------------------------------------------------------------------------------------
		declare @KodT int;
		
		SELECT @KodT=
			isnull(
				nullif(K.KodT,0)
					,isnull((select max(nullif(kodT,0)) from dbo.KodT),0)+1
					)
			FROM
				@Jurnal J
			left join 
				dbo.Jurnal K
					ON EXISTS(SELECT J.KodAB,J.Price,J.Srok,J.SerNumber 
								INTERSECT 
									SELECT K.KodAB,K.Price,K.Srok,K.SerNumber)						
				WHERE
					J.Kod = @next_kod
---------------------------------------------------------------------------------------

		update Jurnal
			set	KodT =@KodT
			where Kod = @next_kod
---------------------------------------------------------------------------------------
		DELETE
			@Jurnal
		WHERE
			Kod = @next_kod					
	END

END

работает очень медленно.
в голове больше ничего не приходит, хотя в голове много пустых мест)
5 апр 12, 23:36    [12373560]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
ZVER-10,
может есть вариант без триггера? или все же триггер написал не грамотно?
6 апр 12, 09:42    [12374146]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
ZVER-10
работает очень медленно.
Неудивительно. Ведь вместо того, чтобы написать один запрос, вы там написали цикл с построчной обработкой записей.
6 апр 12, 10:03    [12374246]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
iljy
Member

Откуда:
Сообщений: 8711
ZVER-10
ZVER-10,
может есть вариант без триггера? или все же триггер написал не грамотно?

Неграмотно - это ну очень мягко сказано. Говнотриггер вы написали, прямо скажем. Нахрена в нем цикл?
6 апр 12, 10:03    [12374248]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить