2012-05-17 2 views
2

Я хочу сгенерировать PK через триггер, поскольку он является обычным PK.sql server trigger for custom PK

Это как в зависимости от поля типа члена, я хочу сгенерировать идентификатор члена, который является PK.

например. если тип члена новой записи - DGIA, тогда идентификатор участника будет DGIA1, DGIA2, DGIA3 ... и т. д. ... если тип члена - DGIL, то идентификатор участника будет DGIL1, DGIL2, DGIL3 ... и так далее. ..

Итак, как написать триггер для того же ... Я пробовал как следует, но он работает только для 1-й записи.

ALTER TRIGGER [dbo].[next_member_id] ON [dbo].[DAD_MEMBERSHIP] AFTER INSERT 
AS 
BEGIN 

DECLARE @COUNT INT 
SET @COUNT=0; 

SELECT @COUNT=ISNULL(MAX(CAST(SUBSTRING(DAD_MEMBERSHIP.MEMBER_ID,5,15) AS INT)),0)+1 FROM DAD_MEMBERSHIP where DAD_MEMBERSHIP.MEMBER_TYPE = DAD_MEMBERSHIP.MEMBER_TYPE 

update DAD_MEMBERSHIP set DAD_MEMBERSHIP.MEMBER_ID = DAD_MEMBERSHIP.MEMBER_TYPE + CONVERT(varchar,@COUNT) 
from DAD_MEMBERSHIP inner join inserted on DAD_MEMBERSHIP.MEMBER_TYPE = inserted.MEMBER_TYPE 

END 
+0

что вы имеете в виду, работая только на 1-й записи? Вы вставляете несколько записей в одну и ту же партию? – Diego

ответ

0

Я решил проблему, используя следующий триггер

ALTER TRIGGER [dbo].[next_member_id] 
    ON [dbo].[DAD_MEMBERSHIP] 
    AFTER INSERT 
AS 
BEGIN 

DECLARE @COUNT INT 
SET @COUNT=0; 

DECLARE @STR VARCHAR(5) 
SET @STR='' 

select @STR=i.MEMBER_TYPE from inserted i; 

SELECT @COUNT=ISNULL(MAX(CAST(SUBSTRING(DAD_MEMBERSHIP.MEMBER_ID,5,15) AS INT)),0)+1 
from DAD_MEMBERSHIP where [email protected] 

update DAD_MEMBERSHIP set DAD_MEMBERSHIP.MEMBER_ID = @STR + CONVERT(varchar,@COUNT) 
from DAD_MEMBERSHIP inner join inserted i on i.MEMBER_TYPE=DAD_MEMBERSHIP.MEMBER_TYPE where DAD_MEMBERSHIP.MEMBER_ID is null 



END 
0

Триггеры работают по партии записей, вы не можете присвоить скалярной переменной и ожидать, что она работает в течение более чем одной записи. Вам нужно переосмыслить весь процесс в процесс на основе набора.

+0

ОК. понял. Если вы можете дать некоторое решение, то это будет здорово, поскольку мы не можем изменить нашу логику, поскольку эти данные уже существуют в оракуле, и мы переходим к SQL-серверу. –