2016-05-02 150 views
0

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

CREATE TABLE TESTING 
(
    ID VARCHAR(10), 
    NAME VARCHAR(15), 
    DESCP VARCHAR(50) 
); 

创造一个新纪录的测试插入的过程与NVARCHAR汽车-incremented 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) 

END

我尝试插入值:

SP_INSERT 'svce','YOUR MANAGEMENT DESCRIPTION'; 

第一次,再次尝试插入我得到相同的ID不增加。

像:

ID  Name 
------------ 
SVC001 SVCE 
SVC001 Svce 
+4

重新发明车轮时,您总会遇到问题。要么使用一个简单的int标识列作为主键,要么使用每行唯一的列组合。在select中或作为计算列创建该varchar值。 –

+0

请注意,在大多数情况下,主键具有表格的聚簇索引。为了提高性能,最好将聚集索引尽可能小。 – shadow

回答

-2

试试这个,

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))))[email protected],'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))))[email protected],'fsf' 

SELECT * FROM @table 
+0

“试试这个”,不是一个答案。解释你在OP代码中看到了什么问题,你提出了什么样的改变,以及为什么会解决这个问题。 – CodeCaster

+0

ok @Doney但我不需要重复选择插入查询,因为我想在项目中使用,所以请告诉我如何选择ID增量值 –

+0

@Doney此代码不存储值 –

1

你可以尝试使用COMPUTED COLUMN类似的东西:

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

我已经试过这个,但我不能够设置小学,所以只有我移动该代码,如果任何其他建议给我请 –

0

我做了一个小小的SCRIPT,

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)) 
+0

这实际上工作,但我想增加一个ID值自动 –

+0

如果它的工作,那么你可以将逻辑放在UDF中并在计算列中调用UDF。 – KumarHarsh

+0

好的@ KumarHarsh我会尽力的 –

0

最后我得到了Auto_Increment 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