带前导填充零的SQL标识
我已在表中将一列标记为标识带前导填充零的SQL标识,sql,sql-server,padding,identity-column,Sql,Sql Server,Padding,Identity Column,我已在表中将一列标记为标识 create table Identitytest( number int identity(1,001) not null, value varchar(500) ) 我需要将标识列增加为001002003,等等 数据库显示它以1,2,3等形式插入 如何做到这一点?您为什么需要它?作为一个整数,001与1相同。如果您想要的是用于显示或其他目的,请创建另一列并在其中执行您的工作(您可以在insert时将其作为表上触发器的一部分来执行,该触发器查看新
create table Identitytest(
number int identity(1,001) not null,
value varchar(500)
)
我需要将标识列增加为001002003
,等等
数据库显示它以1,2,3
等形式插入
如何做到这一点?您为什么需要它?作为一个整数,001与1相同。如果您想要的是用于显示或其他目的,请创建另一列并在其中执行您的工作(您可以在insert时将其作为表上触发器的一部分来执行,该触发器查看新插入的行,并在列中适当地创建条目。如果您想用前导零显示您的
number
列,只需将其填入SELECT
语句中即可。它是一个数字,不会以前导零作为整数存储
SELECT RIGHT('00000' + CAST([number] AS varchar(5)) , 3)
FROM IdentityTest
<代码> 3 是输出显示中想要的字符总数。
< P>如果您需要自动递增数(它只能是一个数字)和数字的字母表示,您可以考虑查看计算列。 这里有几个链接可以帮助您继续:ALTER TABLE dbo.Identitytest
ADD DisplayNumber AS RIGHT('000' + CAST(number AS VARCHAR(3)) , 3) PERSISTED
这样,您的INT标识将被用作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、…
等等
您可以充分利用这两个方面的优势—保留由SQL Server自动增加的整数标识,并且可以以任何方式定义显示格式,并随时提供该格式
我需要标识栏被删除
增加为001002003等
数据库显示它是
插入为1、2、3等
SQL数据库存储值,而不是您用来写入这些值的文本。002
是2。就像1+1
是2一样。您希望选择1+1
显示字符串“1+1”而不是2吗
如果要在列中存储前导零,则必须使用字符类型。但不能使用AUTOINCREMENT
/IDENTITY
您可能真正想要的是从数据库读取的程序中类似于
printf(“%03d”,number)
。我有一个存储整数的表,但用户希望看到它是XXX,即使它有零,所以我写了这段代码
declare @a int
set @a=1
select replicate('0',3-len(@a))+ cast(@a as varchar(4))
以下是另一种方法:
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语句中指定列。没错。这是格式化输出的问题。这是我在过去两天中看到的第二个问题。对于程序员来说,不理解001与1是相同的只是吓人。另一个人想在DateTim中存储日期不带毫秒的数据类型,以便在使用.ToString()时不会显示.Sheesh.+1.这绝对是一个显示问题,而不是存储问题。@Ranjana:客户端应该负责填充。为什么要存储这个?您可以在表上创建一个视图,该视图具有适当的填充整数的逻辑,然后引用该视图并完成操作。+1.我认为演示如何获取显示更有用谢谢你的回复,但我需要把它以001格式存储在数据库中,而不是1,2…@Ranjana:为什么需要存储?谁在消费这个不能利用一点铸造和格式化的东西?你不是说
|
而不是+
?为什么这会得到投票我知道你可能不在乎,但我为我之前的评论道歉,并将删除它们(除了我感到沮丧之前的第一条).我不符合要求,我很抱歉。stackoverflow上已经回答了这个问题:它只能工作到999年,之后,如果你有1000个数字,那么结果是000,1001导致001