2014-01-07 52 views
-1

我需要爲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 

它工作正常,但我不知道如何處理觸發。誰能幫我?謝謝!

+0

什麼是RDBMS? –

+0

MS SQL server 2008 – Happy

+1

您可能需要在上一條SQL語句中使用「Order By Sno」而不是「Order By id」。 –

回答

0
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有Date數據類型來存儲日期值。爲什麼你會對所有的列使用varchar不知道,但我認爲你應該考慮爲你的列使用適當的數據類型,而不是使用VARCHAR。

+1

雖然有人使用varchar來存儲日期,但我不寒而慄!數據完整性問題正在發生。 – HLGEM

+0

@HLGEM告訴我這件事。任何字符串都可能在該列中結束,知道一些信息,最有可能的是,您最終會得到像「Today」或「2day」這樣的數據:) –