Автоинкремент хранимой процедуры - PullRequest
0 голосов
/ 13 апреля 2020
DECLARE @NewID VARCHAR(100)
DECLARE @LastID VARCHAR(100)
DECLARE @Month VARCHAR(2) = RIGHT('0' + CAST(MONTH(GETDATE()) AS VARCHAR(2)),2)
DECLARE @Year VARCHAR(4) = RIGHT('2' + CAST(YEAR(GETDATE()) AS VARCHAR(4)),2)


IF NOT EXISTS(SELECT TOP 1 * FROM Statio_Permintaan_Det 
              WHERE RIGHT(permintaand_nmr, 4) = '2020' 
              ORDER BY permintaand_nmr DESC)
    SET @NewID = 'P/0001/AAIJ/' + @Month + '/' + @Year
ELSE
BEGIN
    SET @LastID = (SELECT TOP 1 permintaand_nmr 
                   FROM Statio_Permintaan_Det 
                   WHERE RIGHT(permintaand_nmr, 4) = '2020' 
                   ORDER BY permintaand_nmr DESC)
    SET @LastID = CAST(SUBSTRING(@LastID, 3, 4) AS INT) +  1
    SET @NewID = 'P/' + RIGHT('0000' + @LastID, 4) + '/AAIJ/' + @Month + '/' + @Year
END

SELECT @NewID AS NewID

При запуске этой программы она должна выглядеть следующим образом P/0002/AAIJ/04/20, потому что в базе данных у меня уже был этот идентификатор P/0001/AAIJ/04/20, что я пропустил?

Я сравнил этот скрипт с другим, который выглядит так же, но я не могу понять, в чем проблема

Есть похожий сценарий, но это работа

DECLARE @NewID VARCHAR(100)
DECLARE @LastID VARCHAR(100)
DECLARE @Month VARCHAR(2) = RIGHT('0' + CAST(MONTH(GETDATE()) AS VARCHAR(2)),2)
DECLARE @Year VARCHAR(4) = YEAR(GETDATE())


IF NOT EXISTS(SELECT TOP 1 * FROM Statio_Tentative_Det WHERE RIGHT(tentd_nmr,4)='2020' ORDER BY tentd_nmr DESC)
    SET @NewID = 'T/0001/AAIJ/'+@Month+'/'+@Year
ELSE
BEGIN
    SET @LastID = (SELECT TOP 1 tentd_nmr FROM Statio_Tentative_Det WHERE RIGHT(tentd_nmr,4)='2020' ORDER BY tentd_nmr DESC)
    SET @LastID = CAST(SUBSTRING(@LastID,3,4) AS INT) +  1
    SET @NewID = 'T/'+RIGHT('0000' + @LastID,4)+'/AAIJ/'+@Month+'/'+@Year
END


SELECT @NewID as NewID

END

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Вы можете сделать следующее:

CREATE TABLE Test(
  Id VARCHAR(45)
);

INSERT Test VALUES ('P/0001/AAIJ/04/20'), ('P/0002/AAIJ/04/20');

DECLARE @NewId VARCHAR(45);

IF NOT EXISTS(SELECT 1 FROM Test WHERE RIGHT(Id, 5) = '04/20')
  SET @NewId = 'P/0001/AAIJ/04/20'
ELSE
  SELECT TOP 1 @NewId = CONCAT('P/', RIGHT(CONCAT('0000', CAST(SUBSTRING(Id, 3, 4) AS INT)+1), 4), '/AAIJ/04/20')
  FROM Test
  ORDER BY Id DESC;

SELECT @NewId;  

Вот дБ <> скрипка

0 голосов
/ 13 апреля 2020

Год в P / 0001 / AAIJ / 04/20 - 2 цифры, но вы тестируете 2020

create table Statio_Permintaan_Det (permintaand_nmr varchar (100))
go 

insert into Statio_Permintaan_Det values ('P/0001/AAIJ/04/20')

DECLARE @NewID VARCHAR(100)
DECLARE @LastID VARCHAR(100)
DECLARE @Month VARCHAR(2) = RIGHT('0' + CAST(MONTH(GETDATE()) AS VARCHAR(2)),2)
DECLARE @Year VARCHAR(4) = RIGHT('2' + CAST(YEAR(GETDATE()) AS VARCHAR(4)),2)


IF NOT EXISTS(SELECT TOP 1 * FROM Statio_Permintaan_Det 
              WHERE RIGHT(permintaand_nmr, 2) = '20' 
              ORDER BY permintaand_nmr DESC)
    SET @NewID = 'P/0001/AAIJ/' + @Month + '/' + @Year
ELSE
BEGIN
    SET @LastID = (SELECT TOP 1 permintaand_nmr 
                   FROM Statio_Permintaan_Det 
                   WHERE RIGHT(permintaand_nmr, 2) = '20' 
                   ORDER BY permintaand_nmr DESC)
    SET @LastID = CAST(SUBSTRING(@LastID, 3, 4) AS INT) +  1
    SET @NewID = 'P/' + RIGHT('0000' + @LastID, 4) + '/AAIJ/' + @Month + '/' + @Year
END

select @lastid, @newid

------------------------------ ------------------------------
2                              P/0002/AAIJ/04/20

(1 row(s) affected)
...