在此表中插入数字时如何保留前导零?

use*_*365 10 sql-server-2008 sql-server

我在一个表中插入了两条记录。

create table num(id int)
insert into num values(0023)
insert into num values(23)
select * from num
Run Code Online (Sandbox Code Playgroud)

当我查询它们时,它们都显示为23. 这意味着 SQL Server 忽略前导 0。这背后的机制是什么?我如何让 SQL Server 在我插入它们时返回值(即002323)?

Gra*_*hey 28

0023不是一个数字。这是一个字符串。23是数字。SQL Server 能够识别出不需要这些额外的零来定义数字,因此它会忽略它们。如果您想向应用程序显示一个值为 0023 的值,我建议您在应用程序端进行格式化。这样,如果您要进行加法、聚合或其他计算,存储在 SQL Server 中的数字仍然是一个数字。如果真的要存储为' 0023',则需要将其转换为字符字段;字符、varchar、nvarchar、nchar。

  • @user8365 - 您问是否可以让 SQL Server 违反该字段的 [域完整性](http://en.wikipedia.org/wiki/Integrity_constraints#Domain_Integrity)。你不能。如果“0023”是一个字符串,则将其存储为一个字符串。如果不是,则将其存储为 INT 并忘记前导零。 (5认同)

a1e*_*x07 5

在其他答案中已经说过这00023是一个数字;我只想补充一点,您可以使用计算列来使用自定义格式显示该数字。例如,

create table num_table(id int not null primary key identity(1,1),
num int, leading_zeros smallint,
constraint chk_leading_zero_nonnegative check (leading_zero>=0),
num_formatted as replicate('0',coalesce(leading_zeros,0)) +cast(num as varchar(10)));
insert into num_table(num,leading_zeros) values(23,2) ;
select num_formatted from num_table; -- output '0023'
Run Code Online (Sandbox Code Playgroud)