Sql server 如何编写此过程以在SQL Server中获取自动递增的字母数字id?

Sql server 如何编写此过程以在SQL Server中获取自动递增的字母数字id?,sql-server,Sql Server,表结构如下: CREATE TABLE tblContact ( SrNo DECIMAL IDENTITY(1,1) NOT NULL, InquiryId VARCHAR(10) PRIMARY KEY, SenderName VARCHAR(50), SenderEmail VARCHAR(200), SenderSubject VARCHAR(50), SenderMessage VARCHAR(MAX), IsActive

表结构如下:

CREATE TABLE tblContact
(   
    SrNo DECIMAL IDENTITY(1,1) NOT NULL,
    InquiryId VARCHAR(10) PRIMARY KEY,
    SenderName VARCHAR(50), 
    SenderEmail VARCHAR(200),
    SenderSubject VARCHAR(50),
    SenderMessage VARCHAR(MAX),
    IsActive BIT DEFAULT(1),
    IsDelete BIT DEFAULT(0),
    CreatedOn DATETIME DEFAULT(GETDATE()),
    CreatedBy VARCHAR(10),
    UpdatedOn DATETIME,
    UpdatedBy VARCHAR(10)
)
CREATE PROC Usp_GetNewInquiryId
AS 
BEGIN
    IF NOT EXISTS(SELECT InquiryId FROM JobPortal.dbo.tblContact)
        DECLARE @PrefixValue VARCHAR(10) = 'INQ'

    DECLARE @InitialValue DECIMAL(10) = 1001

    SELECT InquiryId = @PrefixValue + CAST(ISNULL(MAX(InquiryId), @InitialValue) AS VARCHAR(10)) 
    FROM JobPortal.dbo.tblContact

    ELSE
        /* here I want to eliminate the word 'INQ' from 'INQ1001' towards left side and do increment 1002 from 1001, lastly want to select INQ1002 and so on... */
        SELECT TOP 1 
            InquiryId = @PrefixValue + CONVERT(VARCHAR(10), SUBSTRING(InquiryId, 4, 4)) + 1 
        FROM JobPortal.dbo.tblContact 
        ORDER BY InquiryId DESC
END
程序清单如下:

CREATE TABLE tblContact
(   
    SrNo DECIMAL IDENTITY(1,1) NOT NULL,
    InquiryId VARCHAR(10) PRIMARY KEY,
    SenderName VARCHAR(50), 
    SenderEmail VARCHAR(200),
    SenderSubject VARCHAR(50),
    SenderMessage VARCHAR(MAX),
    IsActive BIT DEFAULT(1),
    IsDelete BIT DEFAULT(0),
    CreatedOn DATETIME DEFAULT(GETDATE()),
    CreatedBy VARCHAR(10),
    UpdatedOn DATETIME,
    UpdatedBy VARCHAR(10)
)
CREATE PROC Usp_GetNewInquiryId
AS 
BEGIN
    IF NOT EXISTS(SELECT InquiryId FROM JobPortal.dbo.tblContact)
        DECLARE @PrefixValue VARCHAR(10) = 'INQ'

    DECLARE @InitialValue DECIMAL(10) = 1001

    SELECT InquiryId = @PrefixValue + CAST(ISNULL(MAX(InquiryId), @InitialValue) AS VARCHAR(10)) 
    FROM JobPortal.dbo.tblContact

    ELSE
        /* here I want to eliminate the word 'INQ' from 'INQ1001' towards left side and do increment 1002 from 1001, lastly want to select INQ1002 and so on... */
        SELECT TOP 1 
            InquiryId = @PrefixValue + CONVERT(VARCHAR(10), SUBSTRING(InquiryId, 4, 4)) + 1 
        FROM JobPortal.dbo.tblContact 
        ORDER BY InquiryId DESC
END
期望输出:

  • 如果表为空,则
    InquiryId=INQ1001
  • 否则
    InquiryId=INQ1002
如果您想返回
tblContact
的“下一个可用的”
InquiryId
,我会这样做:

CREATE PROCEDURE Usp_GetNewInquiryId
AS 
    BEGIN
        IF NOT EXISTS (SELECT InquiryId FROM tblContact)
            SELECT 'INQ1001'
        ELSE
            SELECT TOP 1 'INQ' + CONVERT(VARCHAR,CONVERT(INT,REPLACE(InquiryId,'INQ','')) + 1) FROM tblContact ORDER BY InquiryId DESC
    END

请显示一些示例数据和预期输出查看此链接,了解如何提出一个好问题:首先:如果在
if EXISTS
子句下有多个命令,则必须使用
BEGIN。。。。结束
块。现在,只有当
IF EXISTS
子句为true时,才真正执行第一个命令(缩进),其他命令将始终执行……请注意,
want
和其他形式的txtspk,虽然对您的社交媒体来说很好,但在这里可能会赢得反对票-一般来说,尽可能清晰地编写是一个好主意,让帖子尽可能可读。谢谢您先生/女士的帮助,请保持联系。