簡體   English   中英

SQL Server中的自動增量列值

[英]Auto Increment column values in SQL Server

我有兩列SALARY_CODEFN_YEAR我想根據FN_YEAR列生成如下表:如果FN_YEAR值為18-19SALARY_CODE將為SAL/01-18-19 01-18-19,而下一個SALARY_CODE的值為18-19將為SAL/02-18-19

在此處輸入圖片說明

請幫助我編寫SQL來執行所討論的任務。

DECLARE @intCount int=0;
DECLARE @CustomID nvarchar(16);
DECLARE @fn_year nvarchar(16)='19-20';

SELECT @intCount = Count(SALARY_CODE) FROM temptest WHERE FN_YEAR=@fn_year
IF(@intCount = 0)
BEGIN
    set @CustomID='SAL/1-'+ @fn_year
    insert into temptest values (@CustomID,@fn_year)
END
ELSE
BEGIN
        SET @CustomID= 'SAL/'+ CAST(@intCount+1 as nvarchar(16)) +'-'+@fn_year;
        insert into temptest values (@CustomID,@fn_year)
END

您可以編寫如下功能:

CREATE FUNCTION dbo.getSalaryCode(@fn_year NVARCHAR(16))  
RETURNS NVARCHAR(16)   
AS   
-- Returns the SALARY_CODE 
BEGIN  
    DECLARE @intCount int=0;
    DECLARE @CustomID nvarchar(16);

    SELECT @intCount = Count(SALARY_CODE) FROM temptest WHERE FN_YEAR=@fn_year
    IF(@intCount = 0)
    BEGIN
        SET @CustomID='SAL/1-'+ @fn_year
    END
    ELSE
    BEGIN
        SET @CustomID= 'SAL/'+ CAST(@intCount+1 as nvarchar(16)) +'-'+@fn_year;
    END
    RETURN @CustomID;  
END; 

您可以使用row_number()並與另一列concatenate以獲得所需的結果

with data as ( 
(select '18-19' FN_YEAR union all 
 select '18-19' union all 
 select '18-19' union all 
 select '19-20' union all 
 select '19-20' union all 
 select '20-21')   ) 
 select  FN_YEAR, 
        ('SAL/'+CAST((row_number() OVER (PARTITION BY FN_YEAR order by FN_YEAR)) AS VARCHAR(50))+'-'+FN_YEAR) 
        as SALARY_CODE from data

在這里查看演示

創建一個包含12行(假設需要所有月份)和一個索引列(其編號介於1和12之間)的表(我們將其命名為mnths),並創建另一個表用於所需年份。 然后為每個月和每年在該表中添加行,如下所示:

表名稱:mnths

字段名稱:mnt(值:1-12)

表名:年

字段名稱:yr(值:18-30)

SELECT 'SAL/'+CAST(mnt as nvarchar(2))+'-'+
CAST(yr as nvarchar(2))+'-'+CAST(yr+1 as nvarchar(2)) as SALARY_CODE, 
CAST(yr as nvarchar(2))+'-'+CAST(yr+1 as nvarchar(2)) as FN_YEAR
FROM mnths cross join years

如果您已經有了數據,則可以針對這些表進行驗證並添加缺失的條目。

Divya Agrawal的回答很好。 但是我認為您需要的是一個觸發器 ,當您在表中插入某些內容時會自動填充這些值。 以下過程是如何執行此操作的示例。 ID是您的表主鍵。

CREATE TRIGGER [dbo].[Salary_MyTable]
ON [dbo].[MyTable]
AFTER INSERT
AS
BEGIN
@Id
SELECT @Id = INSERTED.Id FROM INSERTED
SELECT @fn_year= INSERTED.FN_YEAR FROM INSERTED
SELECT @intCount = Count(SALARY_CODE) FROM temptest WHERE FN_YEAR=@fn_year

UPDATE [dbo].[MyTable] SET [SALARY_CODE]= 'SAL/' + CAST(@intCount+1 as nvarchar(16)) +'-'+@fn_year) WHERE @Id = Id

END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM