【问题标题】:Auto Increment Alpha Numeric Field in SQLSQL中的自动递增字母数字字段
【发布时间】:2016-04-04 17:45:16
【问题描述】:

我想知道是否有一种简单的方法可以做到这一点,而不是在这里重新发明轮子。我正在使用 SSMS。有一个数字 JKTUTS0 需要自动递增。所以下一个将是 JKTUTS1、JKTUTS2、JKTUTS3... 然后是 JKTUTT0

这是我到目前为止所拥有的,但它似乎过于复杂,我被困在这一点上。 (这不是主键。)有没有更简单的方法可以做到这一点,或者有人可以帮我吗?我对这一切还是陌生的。谢谢。

DECLARE @IssueRecid CHAR(15) = (SELECT MAX(recid) FROM InventoryIssues) 
DECLARE @IssueNumber CHAR(10) = (SELECT IssueNumber FROM InventoryIssues WHERE recid=@IssueRecid)  
-- Returns JKTUTS0  

DECLARE @IssueNumber1 CHAR(1) = (SELECT LEFT (@IssueNumber, 1))  
DECLARE @IssueNumber2 CHAR(1) = (SELECT SUBSTRING (@IssueNumber, 2,1)) 
DECLARE @IssueNumber3 CHAR(1) = (SELECT SUBSTRING(@IssueNumber, 3,1))  
DECLARE @IssueNumber4 CHAR(1) = (SELECT SUBSTRING(@IssueNumber, 4,1)) 
DECLARE @IssueNumber5 CHAR(1) = (SELECT SUBSTRING(@IssueNumber, 5, 1))
DECLARE @IssueNumber6 CHAR(1) = (SELECT SUBSTRING(@IssueNumber, 6, 1)) 
DECLARE @IssueNumber7 CHAR(1) = (SELECT SUBSTRING(@IssueNumber, 7, 1))

IF @IssueNumber7 = 9 
BEGIN 
DECLARE @NewIssueNumber7 CHAR(1) = 0
DECLARE @NewIssueNumber6 CHAR(1) = needs to be the letter after S

【问题讨论】:

  • 您使用的是哪个 RDBMS? MySQL? SQL 服务器?请在您的问题中引用它并标记它,因为它将吸引更多能够提供帮助的用户
  • SSMS,抱歉。我还是新手。
  • 不要自己编写自动递增的列。伊势身份。这就是它在那里的原因。要生成您想要的数据,您可以在选择时生成它或作为计算列生成它。
  • 对不起,我不明白你的意思。
  • 数字 1 到 6 是否始终为字母,数字 7 是否始终为数字?字母数字总是 A..Z,数字总是 0..9?

标签: sql sql-server ssms increment alpha


【解决方案1】:

我确信有几种方法可以做到这一点,通过访问数据库来创建函数等,所有这些都得到了极大的简化。假设您没有此类访问权限,这里有一些 SQL 将按照您的要求增加问题编号:

declare @IssueNumber char(7) = 'JKTUTS1'

declare @c1 char(1) = substring(@IssueNumber, 1, 1)
       ,@c2 char(1) = substring(@IssueNumber, 2, 1)
       ,@c3 char(1) = substring(@IssueNumber, 3, 1)
       ,@c4 char(1) = substring(@IssueNumber, 4, 1)
       ,@c5 char(1) = substring(@IssueNumber, 5, 1)
       ,@c6 char(1) = substring(@IssueNumber, 6, 1)
       ,@c7 char(1) = substring(@IssueNumber, 7, 1)
       ,@rtn varchar(8) = null

if @c7 <> '9'
begin
  set @c7 = char(ascii(@c7) + 1)
end
else if @c6 <> 'Z'
begin
  set @c7 = '0'
  set @c6 = char(ascii(@c6) + 1)
end
else if @c5 <> 'Z'
begin
  set @c7 = '0'
  set @c6 = 'A'
  set @c5 = char(ascii(@c5) + 1)
end
else if @c4 <> 'Z'
begin
  set @c7 = '0'
  set @c6 = 'A'
  set @c5 = 'A'
  set @c4 = char(ascii(@c4) + 1)
end
else if @c3 <> 'Z'
begin
  set @c7 = '0'
  set @c6 = 'A'
  set @c5 = 'A'
  set @c4 = 'A'
  set @c3 = char(ascii(@c3) + 1)
end
else if @c2 <> 'Z'
begin
  set @c7 = '0'
  set @c6 = 'A'
  set @c5 = 'A'
  set @c4 = 'A'
  set @c3 = 'A'
  set @c2 = char(ascii(@c2) + 1)
end
else if @c1 <> 'Z'
begin
  set @c7 = '0'
  set @c6 = 'A'
  set @c5 = 'A'
  set @c4 = 'A'
  set @c3 = 'A'
  set @c2 = 'A'
  set @c1 = char(ascii(@c1) + 1)
end
else
  set @rtn = 'OVERFLOW'

set @rtn = coalesce(@rtn, @c1 + @c2 + @c3 + @c4 + @c5 + @c6 + @c7)

select @rtn as NewIssueNumber

【讨论】:

  • 非常感谢。我真的很感激。
【解决方案2】:

这里有一个更通用的解决方案:

DECLARE @PreviousIssueNumber char(7),
        @NewIssueNumber char(10);

SET @PreviousIssueNumber = 'JKTUTT9';

DECLARE @LastCharacter char(1);
SET @LastCharacter = RIGHT(@PreviousIssueNumber, 1);

IF @LastCharacter != '9'
BEGIN
    SET @LastCharacter = CHAR(ASCII(@LastCharacter) + 1);
    SET @NewIssueNumber = LEFT(@PreviousIssueNumber, 6) + @LastCharacter;
END
ELSE
BEGIN
    SET @LastCharacter = '0';

    DECLARE @StringIndex int;
    SET @StringIndex = 6;

    DECLARE @CharacterAtStringIndex CHAR;
    SET @CharacterAtStringIndex = SUBSTRING(@PreviousIssueNumber, @StringIndex, 1);

    WHILE @CharacterAtStringIndex = 'Z'
    BEGIN
        SET @StringIndex = @StringIndex - 1;
        SET @CharacterAtStringIndex = SUBSTRING(@PreviousIssueNumber, @StringIndex, 1);
    END

    SET @CharacterAtStringIndex = CHAR(ASCII(@CharacterAtStringIndex) + 1);
    SET @NewIssueNumber = LEFT(STUFF(@PreviousIssueNumber, @StringIndex, 6 - @StringIndex, 'AAAAAA'), 6) + '0';
    SET @NewIssueNumber = STUFF(@NewIssueNumber, @StringIndex, 1, @CharacterAtStringIndex);
END

SELECT @NewIssueNumber;

【讨论】:

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