我正在尝试自动增加字母数字字段(例如productid
表中的product
)。
但是我收到了一个错误(见下文)。 有人可以调查这个错误或任何其他方法来实现这个任务吗?
我的表格详情:
create table tblProduct
(
id varchar(15)
)
create procedure spInsertInProduct
AS
Begin
DECLARE @PId VARCHAR(15)
DECLARE @NId INT
DECLARE @COUNTER INT
SET @PId = 'PRD00'
SET @COUNTER = 0
--This give u max numeric id from the alphanumeric id
SELECT @NId = cast(substring(id, 3, len(id)) as int) FROM tblProduct group by left(id, 2) order by id
--here u increse the vlaue to numeric id by 1
SET @NId = @NId + 1
--GENERATE ACTUAL APHANUMERIC ID HERE
SET @PId = @PId + cast(@NId AS VARCHAR)
INSERT INTO tblProduct(id)values (@PId)
END
我得到以下错误:
消息8120,级别16,状态1,过程spInsertInProduct,第10行 列'tblProduct.id'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 消息8120,级别16,状态1,过程spInsertInProduct,第10行 列'tblProduct.id'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。**
答案 0 :(得分:0)
你的行
SELECT @NId = cast(substring(id, 3, len(id)) as int)
FROM tblProduct
group by left(id, 2)
order by id
没有做你想要的。它失败了,因为你不能直接在select中包含id,因为你是按左(id,2)分组,而不是id本身。分组时不能将某些内容放入select语句中,除非它是Group By的一部分,或者是聚合(例如SUM和MAX)。
(编辑:已更正,左侧和子串不是基于0 - 要获取PRD标记等,我们需要子串4,并留下3。)
这样做的正确方法是:
SELECT @NId = cast(substring(MAX(id), 4, len(MAX(id))) as int)
FROM tblProduct
group by left(id, 3)
order by left(id, 3)
答案 1 :(得分:0)
SELECT @NId = max(
cast(substring(id, 4, len(id)) as int)
)
FROM tblProduct;
这假设您的子字符串函数返回您的id的数字部分。我做了更改,因为在其他例子中你的id是从PRD开始的。
附注:没有理由让您的产品ID在数据库中以PRD开头。如果这是一个标识字段,您可以将其设置为1并在任何显示中只有:'PRD'+ Cast(ID as varchar25))作为ProductID。也许并非所有ID都不是以相同的三个字母开头。
答案 2 :(得分:0)
我已经在SQL Server 2000和查询分析器中测试了您的存储过程,它运行良好。我刚刚删除了创建表代码。