SQL身份标识符带有前导零

8

我在我的表格中将一列标记为“Identity”

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

我希望将身份列自动增加为001,002,003等。

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

这该怎么做呢?


1
为什么这个问题被投票否决了?这个问题很清晰且可以回答。 - kbrimington
2
我知道你可能不在意,但我为我的早期评论道歉并将它们删除(除了在我感到沮丧之前的第一个评论)。我说话过分了,我很抱歉。 - David
这个问题已经在stackoverflow上得到了回答:https://dev59.com/6HRB5IYBdhLWcg3weHLx - sumit sharma
它只能处理999以内的数字,如果你输入1000,则结果为000;如果输入1001,则结果为001。 - Mohammed Dawood Ansari
7个回答

15

正如其他人已经正确指出的那样——整数(INT)从不带有前导零——它只是保存值而已(这样很好)。

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

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

这样,您的INT IDENTITY将被用作整数并始终包含数字值,而 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等等

你可以兼顾两者的优势-你保留了SQL Server自动增加的数字类型的ID,并且你可以定义任何你喜欢的显示格式并且随时可用。


6
如果您想在显示“number”列时添加前导零,只需在您的“SELECT”语句中填充它即可。由于它是一个数字,它不会作为整数存储带有前导零。
SELECT RIGHT('00000' + CAST([number] AS varchar(5)) , 3)
FROM IdentityTest

3是你希望在输出显示中总共有的字符数。


1
+1. 我认为展示如何获得他想要的显示效果比嘲笑他不理解数字更有用。 - David
谢谢回复,但我需要将其以001格式存储在数据库中,而不是1、2...的格式。 - Innova
1
@Ranjana:为什么需要存储?有谁无法利用一些转换和格式化呢? - p.campbell
1
你是不是应该用 || 而不是 + - dan04

3

2

你为什么需要这个呢?作为整数,001和1是相同的。如果你想要显示或其他用途,可以创建另一列并在那里进行操作(你可以将其作为表上的触发器的一部分,在插入时查看新插入的行,并适当地创建该列中的条目)。


3
没错,这只是输出格式的问题。这是我在过去两天里看到的第二个类似的问题了...一个程序员不理解001和1是一样的,这太可怕了。另一个人想把日期存储在DateTime数据类型中,但不包括毫秒,以便在使用.ToString()时不显示它们。唉。 - David
1
+1。 这绝对是显示问题,而不是存储问题。 @Ranjana:客户端应该负责填充。 - p.campbell
为什么要存储这个?你可以在表上创建一个视图,其中包含适当填充整数的逻辑,然后引用该视图即可完成。 - DForck42

1

这里是另一种方法:

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

与向表中添加列并且不需要在选择语句中指定该列相比,数据重复情况要少一些。


1
我有一个表格,里面存储了一个整数,但是用户希望看到的是XXX格式,即使它是0,所以我写了这段代码。
declare @a int
set @a=1


select replicate('0',3-len(@a))+ cast(@a as varchar(4))

0
我需要将标识列增加为001、002、003等。
数据库显示它插入的是1、2、3等。
SQL数据库存储值,而不是您用来编写这些值的文字。002就是2,就像1+1就是2一样。你会期望SELECT 1 + 1显示字符串"1 + 1"而不是2吗?
如果您想在列中存储前导零,则必须使用字符类型。但是,您就不能使用AUTOINCREMENT/IDENTITY。
您可能真正想要的是在从数据库读取的程序中使用类似printf("%03d", number)的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接