2012-05-17 22 views
2

我想通过触发器生成PK,因为它是自定义PK。SQL服务器触发器自定义PK

这就像取决于成员类型字段一样,我想生成PK成员id。

例如如果新记录的成员类型为DGIA,则成员标识为DGIA1,DGIA2,DGIA3 ...等等...如果成员类型为DGIL,则成员标识为DGIL1,DGIL2,DGIL3 ...等等。 ..

所以,如何写触发器相同...我已经尝试了以下,但它只为第一条记录工作。

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

问题你是什么意思只有第一个记录的工作是什么意思?您是否在同一批次中插入多条记录? – 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

好的。得到它了。如果你可以提供一些解决方案,那么它会很好,因为我们不能改变我们的逻辑,因为这些数据已经存在于oracle中,我们正在转向sql server数据库。 –