【问题标题】:SQL Identity with leading padded zeros带有前导填充零的 SQL 标识
【发布时间】:2011-03-26 15:35:56
【问题描述】:

我已在表中将一列标记为身份

create table Identitytest(
    number int  identity(1,001) not null,
    value varchar(500)
)

我需要将标识列递增为001,002,003 等。

数据库显示正在插入1,2,3

如何做到这一点?

【问题讨论】:

  • 为什么会被否决?这个问题很清楚,可以回答。
  • 我知道你可能不在乎,但我为我之前的 cmets 道歉并删除它们(除了我感到沮丧之前的第一个)。我跑题了,很抱歉。
  • 这已在 stackoverflow 上得到解答:stackoverflow.com/questions/611340/…
  • 它只工作到 999,之后,如果你有 1000 个,那么它会导致 000,而 1001 会导致 001

标签: sql sql-server padding identity-column


【解决方案1】:

正如其他人已经正确指出的那样 - INT 从来没有前导零 - 它只是保存值,仅此而已(这样很好)。

如果你需要一些额外的格式,你总是可以在你的表中添加一个计算列,比如:

ALTER TABLE dbo.Identitytest
  ADD DisplayNumber AS  RIGHT('000' + CAST(number AS VARCHAR(3)) , 3) PERSISTED

这样,您的 INT IDENTITY 将用作 INT 并始终包含数值,而 DisplayNumber 包含 001, 002, ... 014, 015, ..... 等等 - 自动地,始终是最新的。

因为它是一个持久化的字段,它现在是你表的一部分,你可以在上面查询,甚至在上面放一个索引来加快查询速度:

SELECT value FROM dbo.IdentityTest WHERE DisplayNumber = '024'

当然,您可以在计算列的定义中使用几乎任何格式,因此您还可以添加前缀或其他内容:

ALTER TABLE dbo.Identitytest
  ADD DisplayNumber 
      AS  'ABC-' + RIGHT('000' + CAST(number AS VARCHAR(3)) , 3) PERSISTED

所以在这种情况下,您的 DisplayNumber 将是 ABC-001, ABC-002, ... 等等。

您将获得两全其美 - 您保留您的 INT IDENTITY,它是数字的并由 SQL Server 自动增加,您可以以任何您喜欢的方式定义显示格式并随时可用。

【讨论】:

    【解决方案2】:

    如果您想用前导零显示您的number 列,只需在您的SELECT 语句中填充它。它是一个数字,它不会将前导零存储为整数。

    SELECT RIGHT('00000' + CAST([number] AS varchar(5)) , 3)
    FROM IdentityTest
    

    3 是您希望输出显示的字符总数。

    【讨论】:

    • +1。我想展示如何获得他想要的展示比取笑他不懂数字更有用。
    • 感谢您的回复,但我需要以 1,2 的 001 格式将其存储在数据库中...
    • @Ranjana:为什么需要存储它?谁在消费这个不能利用一点点转换和格式化的东西?
    • 你的意思是||而不是+吗?
    【解决方案3】:

    如果您需要自动递增的数字(只能是数字)和数字的字母表示形式,您可以考虑查看计算列。

    这里有几个链接可以帮助你:

    【讨论】:

      【解决方案4】:

      你为什么需要它?作为一个整数,001 与 1 相同。如果您想要的是用于显示或其他目的,请创建另一列并在那里执行您的工作(您可以将其作为表上触发器的一部分,在插入时,看起来在新插入的行中,并在列中适当地创建条目。

      【讨论】:

      • 没错.. 这是格式化输出的问题。这是我在过去两天看到的第二个这样的问题。对于一个不理解 001 与 1 相同的程序员来说,这只是可怕的。另一个人想在 DateTime 数据类型中存储没有毫秒的日期,这样在使用 .ToString() 时它们就不会出现。嘘。
      • +1。这绝对是显示问题,而不是存储问题。 @Ranjana:客户应该负责填充。
      • 为什么要存储这个?您可以在表格上创建一个视图,并根据需要填充整数的逻辑,然后引用该视图并完成。
      【解决方案5】:

      我有一个存储整数的表,但用户希望看到它是 XXX,即使它有零,所以我写了这段代码

      declare @a int
      set @a=1
      
      
      select replicate('0',3-len(@a))+ cast(@a as varchar(4))
      

      【讨论】:

        【解决方案6】:

        这是另一种方法:

        create table TEST_T (ui int NOT NULL identity, name varchar(10))
        insert into TEST_T values ( 'FRED' )
        select NAME, ui, RIGHT('0000' + LTRIM(STR(ui)), 4) as ui_T from TEST_T
        go
        /* NOTE: A view could be created with a calculated column instead of the identity column. */
        create view TEST_V as select NAME, RIGHT('0000' + LTRIM(STR(ui)), 4) as ui_V from TEST_T go
        go
        select * from TEST_V
        drop view TEST_V
        drop table TEST_T
        

        数据重复(?)不如向表中添加列多,并且无需在 select 语句中指定列。

        【讨论】:

          【解决方案7】:

          我需要标识列 递增为 001,002,003 等。

          数据库显示它是 插入为 1,2,3 等。

          SQL 数据库存储值,而不是用于编写这些值的文字。 002 is 2. 就像1 + 1 is 2. 您是否希望 SELECT 1 + 1 显示字符串“1 + 1”而不是 2?

          如果您希望将前导零存储在列中,则必须使用字符类型。但是你不能使用AUTOINCREMENT/IDENTITY

          您可能真正想要的是从数据库读取的程序中的printf("%03d", number)

          【讨论】:

            猜你喜欢
            • 2014-09-19
            • 2015-05-21
            • 2021-07-19
            • 2011-10-09
            • 2011-03-28
            • 2011-02-06
            • 2010-11-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多