通过填充SQL Server中的前导零来格式化数字

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

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

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

在我的新表中,我可以采取快捷方式并复制旧表,但我希望通过简单地存储从1999999整数值来实现更好的数据传输,更小的尺寸等。

在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

将数字6更改为您的总长度所需的值:

 SELECT REPLICATE('0',6-LEN(EmployeeId)) + EmployeeId 

如果列是INT,则可以使用RTRIM将其隐式转换为VARCHAR

 SELECT REPLICATE('0',6-LEN(RTRIM(EmployeeId))) + RTRIM(EmployeeId) 

并删除这些0代码,并取回'真正'的数字:

 SELECT RIGHT(EmployeeId,(LEN(EmployeeId) - PATINDEX('%[^0]%',EmployeeId)) + 1) 

只需使用FORMAT函数(适用于SQL Server 2012或更新版本):

 SELECT FORMAT(EmployeeID, '000000') FROM dbo.RequestItems WHERE ID=0 

参考: http : //msdn.microsoft.com/en-us/library/hh213505.aspx

你可以用这种方式改变你的程序

 SELECT Right('000000' + CONVERT(NVARCHAR, EmployeeID), 6) AS EmpIDText, EmployeeID FROM dbo.RequestItems WHERE ID=0 

但是,这假设你的EmployeeID是一个数字值,这段代码将结果更改为一个string,我build议再次添加原始数值

编辑当然,我没有仔细阅读上面的问题。 它说这个字段是一个char(6)所以EmployeeID不是一个数字值。 虽然这个答案本身仍然是一个价值,但它不是上述问题的正确答案。

恨不得不转换整数,这似乎更简单。 因为只有一个string转换和简单的加法,所以甚至可能执行得更好。

selectRIGHT(1000000 + EmployeeId,6)…

只要确保“1000000”至less有所需的大小为零。

另一种方式,只是为了完整性。

 DECLARE @empNumber INT = 7123 SELECT STUFF('000000', 6-LEN(@empNumber)+1, LEN(@empNumber), @empNumber) 

或者,根据您的查询

 SELECT STUFF('000000', 6-LEN(EmployeeID)+1, LEN(EmployeeID), EmployeeID) AS EmployeeCode FROM dbo.RequestItems WHERE ID=0 

我张贴在一个地方,所有的作品为我填写4领先的零:)

 declare @number int = 1; print right('0000' + cast(@number as varchar(4)) , 4) print right('0000' + convert(varchar(4), @number) , 4) print right(replicate('0',4) + convert(varchar(4), @number) , 4) print cast(replace(str(@number,4),' ','0')as char(4)) print format(@number,'0000') 
 SELECT replicate('0', 6 - len(employeeID)) + convert(varchar, employeeID) as employeeID FROM dbo.RequestItems WHERE ID=0 

尽可能干净,并给variables的范围进行replace:

 Select RIGHT(REPLICATE('0',6) + EmployeeID, 6) from dbo.RequestItems WHERE ID=0 

从2012年开始,您可以使用

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

对于所有Sql版本,该解决scheme适用于带有前导零的带符号/负数的数字:

 DECLARE @n money = -3, @length tinyint = 15, @decimals tinyint = 0 SELECT REPLICATE('-', CHARINDEX('-', @n, 1)) + REPLACE(REPLACE(str(@n, @length, @decimals), '-', ''), ' ', '0')