Sql server Id自动递增varchar不递增

Sql server Id自动递增varchar不递增,sql-server,Sql Server,我使用VARCHAR列作为主键。我想自动增加它(基数62,小写/大写,数字),但是,下面的代码失败了(原因很明显): 创建用于测试插入具有NVARCHAR自动递增ID的新记录的过程: CREATE PROCEDURE SP_INSERT @NAME VARCHAR(MAX), @DESCP VARCHAR(MAX) AS BEGIN /* Logic for getting new ID as per the NAME with PRE FIX */ DECLAR

我使用
VARCHAR
列作为主键。我想自动增加它(基数62,小写/大写,数字),但是,下面的代码失败了(原因很明显):

创建用于测试插入具有
NVARCHAR
自动递增ID的新记录的过程:

CREATE PROCEDURE SP_INSERT 
     @NAME VARCHAR(MAX), @DESCP VARCHAR(MAX)
AS 
BEGIN
    /* Logic for getting new ID as per the NAME with PRE FIX */ 
    DECLARE @NEWID VARCHAR(5);
    DECLARE @PREFIX VARCHAR(10); 

    SET @PREFIX = UPPER(SUBSTRING('STR', 1, 3)) 

    SELECT @NEWID = (@PREFIX + replicate('0', 3 - len(CONVERT(VARCHAR, N.OID 1))) + CONVERT(VARCHAR, N.OID + 1)) 
    FROM 
        (SELECT 
             CASE 
                WHEN MAX(T.TID) IS NULL
                THEN 0 ELSE MAX(T.TID) 
             END AS OID 
         FROM 
             (SELECT SUBSTRING(ID, 1, 1) AS PRE_FIX,
                     SUBSTRING(ID, 2, LEN(ID)) AS TID 
              FROM Testing) AS T 
         WHERE 
             T.PRE_FIX = @PREFIX) AS N
   /* INSERT QUERY FOR NEW RECORD */
   INSERT INTO Testing VALUES (@NEWID, @NAME, @DESCP)
结束

我尝试插入一个值:

SP_INSERT 'svce','YOUR MANAGEMENT DESCRIPTION';
这是第一次,再次尝试插入我得到的相同ID不递增

比如:

试试这个

DECLARE @table TABLE(ID VARCHAR(10),
 NAME VARCHAR(15),
 DESCP VARCHAR(50))

DECLARE @NEWID VARCHAR(5);
   DECLARE @PREFIX VARCHAR(10); 

SET @PREFIX = UPPER(SUBSTRING('STR', 1, 3)) 

 SELECT @NEWID=CAST(ISNULL(MAX(CAST(SUBSTRING(ID,4,LEN(ID)) AS INT)),0)+1 AS varchar) FROM @table
 INSERT INTO @table(DESCP,ID,NAME)
 SELECT 'zzzz',(@PREFIX + replicate('0', 3 - len(CONVERT(VARCHAR,@NEWID))))+@NEWID,'fsf'

 SELECT @NEWID=CAST(ISNULL(MAX(CAST(SUBSTRING(ID,4,LEN(ID)) AS INT)),0)+1 AS varchar) FROM @table
 INSERT INTO @table(DESCP,ID,NAME)
 SELECT 'zzzz',(@PREFIX + replicate('0', 3 - len(CONVERT(VARCHAR,@NEWID))))+@NEWID,'fsf'

 SELECT * FROM @table

您可以尝试使用类似以下内容的
计算列

create table t
(
    Id int auto_increment,
    ComputedId as 'SVC' + convert(nvarchar(60), lpad(Id,3,'0')),
    Data nvarchar(60)
)

我写了一个小剧本

declare @t table (id varchar(10))
insert into  @t values ('SVC001'),('SVC20902')
Declare @NEWID int
select @NEWID=isnull(max(replace(id,'SVC',''))+1,1) from @t

select 'SVC'+ replicate('0',CASE WHEN 3-len(@NEWID)<=0 
THEN 0 ELSE 3-len(@NEWID) END)+cast(@NEWID as varchar(10))
declare@t表(id varchar(10))
插入@t值('SVC001'),('SVC20902'))
声明@NEWID int
从@t中选择@NEWID=isnull(max(替换(id,'SVC','')+1,1)

选择“SVC”+replicate('0',当3-len(@NEWID)最终我得到了自动增量ID的解决方案时,我为解决方案完成了以下代码。代码为:

alter PROCEDURE SP2_INSERT
      @NAME VARCHAR(MAX),
      @DESCP VARCHAR(MAX)
AS
BEGIN
      DECLARE @NEWID VARCHAR(10);
      DECLARE @PREFIX VARCHAR(MAX);
   SET @PREFIX = UPPER(SUBSTRING(@NAME,1, 3))

   SELECT @NEWID = (@PREFIX + replicate('0', 3 - len(CONVERT(VARCHAR,N.OID + 1))) + CONVERT(VARCHAR,N.OID + 1)) FROM (
   SELECT CASE WHEN MAX(T.TID) IS null then 0 else MAX(T.TID) end as OID FROM (
   SELECT SUBSTRING(EmployeeID, 1, 1) as PRE_FIX,SUBSTRING(EmployeeID, 2, LEN(EmployeeID)) as TID FROM EmployeeMasters
 ) AS T WHERE T.PRE_FIX = @PREFIX
) AS N
INSERT INTO Testing VALUES (@NEWID,@NAME,@DESCP)
end

在重新发明控制盘时,您总是会遇到问题。可以使用简单的int-identity列作为主键,也可以使用每行唯一的列组合。在select或计算列中创建该varchar值。请注意,在大多数情况下,主键具有表的聚集索引。最好的做法是将聚集索引设置为尽可能小的值以提高性能。“尝试此操作,”不是答案。请解释您认为OP的代码存在什么问题,您提出了什么更改,以及解决问题的原因。ok@Doney但我不需要重复选择、插入查询,因为我想在项目中使用,所以请告诉我如何选择ID增量value@Meena它只需要一次选择插入值也是可能的le…值('zzzz',(@PREFIX+replicate('0',3-len(CONVERT(VARCHAR,@NEWID)))+@NEWID,'fsf'))我已经试过了,但是我不能设置primary,所以只有我移动了那段代码,如果其他建议给我带来了乐趣。这确实有效,但是我想自动增加一个ID值。如果有效,那么你可以把逻辑放在UDF中,并在computed列中调用UDF。
declare @t table (id varchar(10))
insert into  @t values ('SVC001'),('SVC20902')
Declare @NEWID int
select @NEWID=isnull(max(replace(id,'SVC',''))+1,1) from @t

select 'SVC'+ replicate('0',CASE WHEN 3-len(@NEWID)<=0 
THEN 0 ELSE 3-len(@NEWID) END)+cast(@NEWID as varchar(10))
alter PROCEDURE SP2_INSERT
      @NAME VARCHAR(MAX),
      @DESCP VARCHAR(MAX)
AS
BEGIN
      DECLARE @NEWID VARCHAR(10);
      DECLARE @PREFIX VARCHAR(MAX);
   SET @PREFIX = UPPER(SUBSTRING(@NAME,1, 3))

   SELECT @NEWID = (@PREFIX + replicate('0', 3 - len(CONVERT(VARCHAR,N.OID + 1))) + CONVERT(VARCHAR,N.OID + 1)) FROM (
   SELECT CASE WHEN MAX(T.TID) IS null then 0 else MAX(T.TID) end as OID FROM (
   SELECT SUBSTRING(EmployeeID, 1, 1) as PRE_FIX,SUBSTRING(EmployeeID, 2, LEN(EmployeeID)) as TID FROM EmployeeMasters
 ) AS T WHERE T.PRE_FIX = @PREFIX
) AS N
INSERT INTO Testing VALUES (@NEWID,@NAME,@DESCP)
end