如何编写触发器以生成重复值的序列号

时间:2014-01-07 19:08:45

标签: sql sql-server sql-server-2008

我需要为SQL Server表中的重复值生成序列号。

这是我的表

CREATE TABLE [dbo].[tbl_all_purple_flag_level](
[Sno] [int] IDENTITY(1,1) NOT NULL,
[Id] [varchar](50) NULL,
[Name] [varchar](50) NULL,
[Score] [varchar](50) NULL,
[Disability_Level] [varchar](50) NULL,
[visited_count] [varchar](50) NULL,
[Date] [varchar](50) NULL
)

如果id重复了数字,我需要visited_count作为序列号(1,2,3 ......)

我试过这段代码

SELECT 
   id, 
   RIGHT('0'+ CAST((ROW_NUMBER() OVER (Partition By id Order By id)) as varchar(2)), 2) as duplicate_id
FROM 
   tbl_all_purple_flag_level 

它工作正常,但我不知道如何做触发器。谁能帮我?谢谢!

1 个答案:

答案 0 :(得分:1)

ALTER TRIGGER tr_After_Update_Inser
ON [dbo].[tbl_all_purple_flag_level]
FOR INSERT, UPDATE
AS
BEGIN
 SET NOCOUNT ON;
WITH Updateable
AS
 (
  SELECT [Sno], id,  [visited_count],
        RIGHT('0'+ CAST((ROW_NUMBER() OVER (Partition By id Order By id, [Date] DESC)) as varchar(2)), 2) as duplicate_id
  FROM tbl_all_purple_flag_level 
 )
 UPDATE Updateable
  SET [visited_count] =  duplicate_id
END

有一点我想指出,SQL Server有数据类型来存储几乎所有类型的数据,我可以看到你在Varchar数据类型和ID中保存日期并且在varchar数据类型中得分全部,Sql Server有{ {1}}用于存储日期值的数据类型。为什么你会为所有列使用varchar而不知道,但我认为你应该考虑为你的列使用适当的数据类型而不是使用VARCHAR。