C# 无法在对象';dbo.CLIENT';具有唯一索引'@KOD#U客户机';

C# 无法在对象';dbo.CLIENT';具有唯一索引'@KOD#U客户机';,c#,asp.net,sql,sql-server,asp.net-mvc,C#,Asp.net,Sql,Sql Server,Asp.net Mvc,代码如下: 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时,

代码如下:

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”中插入重复的键行 索引'@KOD_CLIENT'

列KOD的数据类型为varchar(10)

…对字符串使用
MAX
,因为字符串按字母顺序排序意味着
2
大于
10
。这将严重打乱您的编号方案,因为表中有2和10,您将生成的下一个数字是3

您想要的是首先强制转换,然后对整数执行
MAX

SELECT CAST(MAX(CAST(SUBSTRING(KOD,3,4) AS INT)) + 1 AS VARCHAR(7)) 


作为补充说明,在数据库中生成自己的顺序ID很少是一个好主意,因为同时写入可能会冲突并阻止插入成功。您可能需要重新考虑数字生成,并将其基于(例如)一个自动递增列。

您的实际问题是什么?@GarethD,当我尝试在table CLIENT上添加行时,KOD列给我一个错误。如何修复此代码?我相信你知道我写的代码是做什么的。它仍然会给我同样的错误。:/但是当我从代码中删除
'K'+
时,它就可以工作了。知道为什么吗?@aldoblack如果您只有一个字符前缀,您需要将子字符串更改为
子字符串(2,4)
,因为您在施放之前要删除2个字符。如果您仍然遇到错误,您是否可以发布一个SQLFIDLE,并提供一个更现实的示例来显示失败?是的,我必须执行
子字符串(2,4)
。非常感谢。现在可以用了D
SELECT CAST(MAX(CAST(SUBSTRING(KOD,3,4) AS INT)) + 1 AS VARCHAR(7))