使用字母数字自动增加值

时间:2010-10-31 15:06:28

标签: sql sql-server sql-server-2005


我正在尝试自动增加字母数字字段(例如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子句中。**

3 个答案:

答案 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和查询分析器中测试了您的存储过程,它运行良好。我刚刚删除了创建表代码。