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