使用MAX()生成NVARCHAR类型供应商ID时,ID=10未被统计的问题求助
问题解决思路
问题根源
你用MAX()取nvarchar类型的ID时,因为字符串是按逐字符ASCII码排序的,"10"的第一个字符'1'比"2"的'2'ASCII值小,所以MAX()会把"9"当成最大ID,根本识别不到"10"。COUNT()的问题确实没法解决,删了记录就乱了。
解决方案
把代理商的ID先转换成数值类型再取最大值,加1后再转回nvarchar,就能正确生成递增ID了。
具体SQL示例
假设你的表叫Suppliers,用IsAgent字段区分代理商(1=代理商,0=分销商):
- 先获取当前最大的代理商数值ID:
SELECT ISNULL(MAX(TRY_CAST(SupplierID AS INT)), 0) AS MaxAgentID FROM Suppliers WHERE IsAgent = 1
- 生成新ID并插入:
DECLARE @NewAgentID NVARCHAR(10) -- 取最大数值ID加1,再转成字符串 SET @NewAgentID = CAST( (SELECT ISNULL(MAX(TRY_CAST(SupplierID AS INT)), 0) + 1 FROM Suppliers WHERE IsAgent = 1) AS NVARCHAR(10)) -- 插入新代理商数据 INSERT INTO Suppliers (SupplierID, IsAgent, [其他字段]) VALUES (@NewAgentID, 1, [对应值])
额外注意
- 如果手动录入的分销商ID有非数字字符,
TRY_CAST会返回NULL,MAX()会自动忽略这些NULL,不影响代理商ID的计算; - 要是怕有非数字的代理商ID混进来,可以加过滤条件:
AND SupplierID LIKE '[0-9]%'; - 高并发场景下,建议把取ID和插入操作放到事务里,避免同时插入导致ID重复。
内容的提问来源于stack exchange,提问作者devChing
相关产品推荐
相关产品推荐

