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