【问题标题】:Auto increment values with alpha numeric使用字母数字自动递增值
【发布时间】:2010-10-31 15:06:28
【问题描述】:


我正在尝试自动增加字母数字字段(比如product 表中的productid)。

但我收到错误消息(见下文)。 有人可以看看这个错误或任何其他方法来完成这个任务吗?

我的餐桌详情:

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 子句中。**

【问题讨论】:

  • 这是一个严肃的求助请求吗? “create table”语句是一长行,因此不可读,与错误消息相同。此外,没有提供有关使用的数据库和数据库版本的信息。
  • 我的第一个问题是无法格式化问题可读格式。数据库版本是 SQL Server 2005
  • 我尝试重新格式化问题并将您的数据库版本添加为标签。
  • 您可能要考虑的字母数字/自动编号的两个答案:stackoverflow.com/questions/2177584/…stackoverflow.com/questions/2655392/…

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


【解决方案1】:
 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都不以相同的三个字母开头的那么简单。

【讨论】:

  • 嗨,杰夫先生,现在我收到此对话错误:消息 245,级别 16,状态 1,过程 spInsertInProduct,第 12 行 将 varchar 值“D00”转换为数据类型 int 时转换失败。
  • 请举一个ID的例子,我们可以帮助您处理子字符串。我猜你在某些情况下不应该从 3 字符开始。
【解决方案2】:

你的线路

SELECT @NId = cast(substring(id, 3, len(id)) as int)
  FROM tblProduct
  group by left(id, 2)
  order by id

没有做你想做的事。它失败了,因为您不能直接在选择中包含 id ,因为您是按 left(id, 2) 分组的,而不是 id 本身。分组时不能在 select 语句中放入一些东西,除非它是 Group By 的一部分,或者是一个聚合(例如 SUM 和 MAX)。

(编辑:已更正,Left 和 Substring 不是基于 0 的——要获取 PRD 标签等,我们需要 substring 4,left 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)

【讨论】:

  • 嗨,布里斯贝先生,您能否以正确的方式重新格式化下面的行,因为我不明白您在说什么...
  • SELECT @NId = cast(substring(id, 3, len(id)) as int) FROM tblProduct group by left(id, 2) order by id
  • group by语句中的引用不需要在查询中的select语句中
  • 你是说这是不正确的(Northwind db):从 dbo.Employees 组中选择姓氏,按标题,姓氏;因为标题不在选择项中,也没有任何聚合函数。
  • @Jeff O:不,因为 LastName 在 group by 中,它可以是 select 的一部分。另一方面,我说这是不正确的:SELECT title FROM dbo.Employees GROUP BY LEFT(T​​itle, 2)。
【解决方案3】:

我已经在 SQL Server 2000 和查询分析器中测试了您的存储过程,它运行良好。只是我从中删除了创建表代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多