Sql 使用A999获取下一个最大问题>;1000

Sql 使用A999获取下一个最大问题>;1000,sql,vbscript,Sql,Vbscript,一些产品序列号为varchar类型,有一个字母表示类型,后跟一个数字。数字由0填充到5位,我们接近“10万” 对于项目数少于100000的字母,他们仍然希望0填充最多5位数字,而项目数超过100000的字母,无论数字是多少,他们都希望0填充最多5位数字 它当前查找的当前最大序列号如下所示: SELECT MAX(SerialNumber) FROM Table WHERE LEFT(SerialNumber, 1) = @leadingChar UPDATE Table SET Serial

一些产品序列号为varchar类型,有一个字母表示类型,后跟一个数字。数字由0填充到5位,我们接近“10万”

对于项目数少于100000的字母,他们仍然希望0填充最多5位数字,而项目数超过100000的字母,无论数字是多少,他们都希望0填充最多5位数字

它当前查找的当前最大序列号如下所示:

SELECT MAX(SerialNumber) FROM Table WHERE LEFT(SerialNumber, 1) = @leadingChar
UPDATE Table SET 
SerialLetter = SUBSTRING(Serial, 0, 1), 
SerialNumber = SUBSTRING(Serial, 1, 99)
但是,使用此方法时,选择“A99999”而不是“A100000”,因为9>1。(和Zoo在字典中紧跟Apple的原因一样,前导字符的字符数更多,但值更少。)

因此,问题是当它增加当前最大序列号以获得“A99999”之后的下一个序列号时,每次您获得新序列号时,您将获得“A100000”

将它们拆分为数据库中的char列和int列会很麻烦,因为它在多个表中使用,并且总共有几百万个序列号

它是在vbscript/classic asp数据库SQL Server 7中作为web应用程序编写的

如果有更好的标签/标题,请随时编辑/让我知道


感谢您的帮助。

您可以尝试此操作以获得主角的最大数字:

SELECT MAX(CAST(SUBSTRING(SerialNumber, 2, 99) AS INT))
FROM Table1
WHERE LEFT(SerialNumber, 1) = @leadingChar

但是它会很慢,因为它无法使用索引来查找最大数量。正如你在问题中提到的那样,最好把它分成两列。做出改变可能会很尴尬,但将来会对你有所帮助。

< P>你可以考虑在Matt Gibson关于自然排序的评论中所采用的方法。< /P> 作为一名数据仓库开发人员,我不是 对生意人的方式很陌生 希望看到事情得到妥善处理,这是非常重要的 永远不要。。。我做的一件事就是 向我的数据库和数据库中添加额外的列 放入“更正”版本的 我用的钥匙,所以我的桌子看起来 比如:

…这意味着我可以使用SQL的 标准ASCII排序(索引为 速度,如果需要)而不是淤泥 客户有什么事吗 应用。客户提交 用户的真实密钥,但按 预先计算的ASCII排序安全密钥, 我只需要做艰苦的工作 一次,在前面

这意味着在当前表中添加一个额外的字段,该字段仅用于生成密钥。“获取下一个密钥”代码将引用新字段,但也会填充现有字段,以便大多数代码和外键数据保持原样


您也可以考虑使用SQLlike运算符来查找序列号字段上有索引的MAX。您发布的代码可能无法使用索引,因为您正在将函数应用于WHERE子句中的字段(我不熟悉SQL Server 7查询优化的详细信息,因此不能确定)。

如果您发现您的解决方案性能不足,并且您想要一个需要最少应用程序更改的更快的解决方案,你可以试试这个:

在表中创建两列,
SerialLetter
SerialNumber

然后像这样填充它们:

SELECT MAX(SerialNumber) FROM Table WHERE LEFT(SerialNumber, 1) = @leadingChar
UPDATE Table SET 
SerialLetter = SUBSTRING(Serial, 0, 1), 
SerialNumber = SUBSTRING(Serial, 1, 99)
如果您的表很大,这些查询可能会运行很长时间,因此您可能希望在负载较低时执行查询,并且您可能需要调整超时值

然后创建update和insert触发器,以便表中的任何序列都将反映在新列中

然后按顺序在SerialLetter和SerialNumber上创建索引。(两列上有一个索引)

那你可以

SELECT MAX(SerialNumber) WHERE SerialLetter = 'X'

在很短的时间内,因为它将只使用索引,而不会命中表。

+1感谢这看起来是一个设计东西的好方法,如果我最终编辑了表,我将对此进行更多的研究。不过现在我要用另一个解决方案。谢谢,我今天早上测试了它,效果很好。我将详细研究拆分列或采用martin clayton建议的方法需要做多少工作。谢谢,这看起来相当容易实现,应该可以加快查询速度。今天我将对此进行测试。这将在对当前表进行最小更改的情况下加快所需max serial的寻道时间。