В настоящее время у меня возникает следующая проблема.
Если вы посмотрите на приведенный ниже тестовый пример:
declare @Count int
, @id int = 777
declare @table table
( id int identity primary key
, JCid int
, line int
, udf float )
insert into @table (jcid,line,udf)
values
(777,1,1),
(777,2,2.1),
(777,3,2.2),
(777,4,2),
(777,5,3)
select
@Count = count(left(L.udf,1))
from @table L
where L.jcid = @id
group by left(L.udf,1)
having count(left(L.udf,1))>1
select @Count
При запуске этого процесса я получаю желаемые результаты 3однако после разработки приведенного ниже триггера я не могу заставить счет работать правильно:
create trigger kv_trg_JobLineNumberUpdate_AW on _btblJCTxLines
after insert, update
as
declare @LineNum float
, @OldLine float
, @id int
, @Count int
, @Err nvarchar(500)
set @Err = '--------------------------';
set @Err = @Err + @Err + CHAR(10);
set @Err = @Err + CHAR(10);
set @Err = @Err + 'You are not allowed to change this Line Number!';
select
@LineNum = iLineID
, @OldLine = isnull(ufJCTxCMLineNumber,0)
, @id = iJCMasterID
from inserted
select
@Count = count(left(L.ufJCTxCMLineNumber,1))
from _btblJCTxLines L
join inserted i on left(L.ufJCTxCMLineNumber,1) = left(i.ufJCTxCMLineNumber,1)
where L.iJCMasterID = @id
group by left(L.ufJCTxCMLineNumber,1)
having count(left(L.ufJCTxCMLineNumber,1))>1
begin
if @OldLine = 0
begin
if @Count >= 2
begin
update _btblJCTxLines
set ufJCTxCMLineNumber = cast(@LineNum as varchar)+'.'+cast(@Count as varchar)
from _btblJCTxLines L
join inserted on L.idJCTxLines = inserted.idJCTxLines
end
else
begin
update _btblJCTxLines
set ufJCTxCMLineNumber = @LineNum
from _btblJCTxLines L
join inserted on L.idJCTxLines = inserted.idJCTxLines
end
end
else
begin
select
@OldLine = deleted.ufJCTxCMLineNumber
, @LineNum = inserted.ufJCTxCMLineNumber
from inserted, deleted
if (@OldLine <> @LineNum)
begin
raiserror(@Err, 16, 1)
rollback tran
return;
end
end
end
go
Поле ufJCTxCMLineNumber - это дублируемый номер, который я ищу.
Это срабатываетглавная цель - убедиться, что поле ufJCTxCMLineNumber никогда не имеет дубликатов.
Что происходит, пользователь вставляет новую строку, когда он добавляет новую строку над любой текущей строкой, я хочу, чтобы поле ufJCTxCMLineNumber обновлялось до3.1 в зависимости от количества дубликатов.
Как мне получить правильный счет?
Перейдите по этой ссылке для получения образцов данных.