在SQL Server中使用前导零填充格式化数字

167

我们有一张旧的 SQL 表格,SQL Server 2000 使用了近 10 年。

其中,我们的员工工号存储为 char(6),范围从000001999999

我正在编写一个 web 应用程序,需要存储员工工号。

在我的新表格中,我可以采取捷径并复制旧表格,但是我希望通过仅存储 1999999int值来实现更好的数据传输、更小的大小等优点。

在 C# 中,我可以快速地使用以下格式设置符号将 int 值格式化为工号:

public static string GetBadgeString(int badgeNum) {
  return string.Format("{0:000000}", badgeNum);
  // alternate
  // return string.Format("{0:d6}", badgeNum);
}

我该如何修改这个简单的SQL查询语句,使得返回值也可以被格式化?

SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0

如果EmployeeID是7135,则此查询应返回007135


由于在这个领域中,前导的 0 是有意义的,那么为什么要将它改为 INT 呢? - Oded
3
SQL Server 2012将终于拥有类似于C#的FORMAT函数 :-) - marc_s
1
@Oden:int 值占用的空间比 char(6) 小得多,而每个制造的零件中都会有多个这样的条目。效率。 - user153923
你在遇到问题之前优化了吗? - Oded
5
假设你有最多一百万个徽章号码,你认为你可以通过使用 DATALENGTH() 函数来节省两个字节的存储空间。如果该列可能在索引中使用,你可能会节省超过 2MB 的空间。而且,加上其他列的存储空间,这 2 个字节可能足以减少行长度,从而每行可节省一个 4KB 的页面。这个系统是否要部署在移动平台上?或者你是不是把注意力放在了一个无产出的领域? - HABO
显示剩余3条评论
14个回答

2
SELECT 
    cast(replace(str(EmployeeID,6),' ','0')as char(6)) 
FROM dbo.RequestItems
WHERE ID=0

糟糕,当我输入了“7135”时,它实际上给了我“7135.0”。 - user153923

1
该解决方案适用于带有前导零的有符号/负数,在所有Sql版本中均可使用:
DECLARE
    @n money = -3,
    @length tinyint = 15,
    @decimals tinyint = 0

SELECT REPLICATE('-', CHARINDEX('-', @n, 1)) + REPLACE(REPLACE(str(@n, @length, @decimals), '-', ''), ' ', '0')

1

最简单的方法总是最好的:

Select EmployeeID*1 as EmployeeID 

0

在我的SQL版本中,我无法使用REPLICATE。因此我这样做:

SELECT 
    CONCAT(REPEAT('0', 6-LENGTH(emplyeeID)), emplyeeID) AS emplyeeID 
FROM 
    dbo.RequestItems`

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