这是代码:
string CLIENT = "declare @KOD VARCHAR(10)
set @KOD = 'K' + (SELECT CAST(MAX(SUBSTRING(KOD,3,4)) + 1 as VARCHAR(7)) KOD
FROM CLIENT
WHERE INTERNET='TABLET')";
列KOD递增1,示例K1,K2,K3,当它达到K10并且我尝试添加一行时它会向我显示此问题。
无法在对象' dbo.CLIENT'中插入重复的键行。与众不同 index' @KOD_CLIENT'。
列KOD的DataType是varchar(10)
答案 0 :(得分:4)
SELECT CAST(MAX(SUBSTRING(KOD,3,4)) + 1 as VARCHAR(7))
...在字符串上使用MAX
,因为按字母顺序排序字符串意味着2
大于10
。这将严重搞乱你的编号方案,因为在表中有2和10,你将生成的下一个数字是3.
你想要的是首先施放并对整数做MAX
;
SELECT CAST(MAX(CAST(SUBSTRING(KOD,3,4) AS INT)) + 1 AS VARCHAR(7))
A simple SQLfiddle to show the difference
作为旁注,在数据库中生成自己的顺序ID很少是个好主意,因为同时写入可能会发生冲突并阻止插入成功。您可能需要重新考虑数字生成并将其基于 - 例如 - 自动增量列。