如何在SQL Server 2005数据库中使用T-SQL使用零填充NVARCHAR字段?

时间:2009-07-10 18:52:13

标签: sql tsql dynamics-crm dynamics-crm-4

我有一个Orders表,它将Ordernumber存储为NVarChar。我们通过查询降序排序的最大订单号并返回前1然后添加1来手动递增订单号。我们在Microsoft CRM 4.0中实现了这一点。

例如订单号(NVarchar)

99
456
32

当我查询上面的值时,它返回99而不是456.我想在SQL Server 2005中使用sql脚本将所有当前订单号填充到类似000099或000456的内容。所以上面的例子将是

000099
000456
000032

为了实现这个目的,我需要编写哪些SQL脚本?

5 个答案:

答案 0 :(得分:11)

这是LessThanDot上的精彩填充教程。

DECLARE @Numbers TABLE
(Num INT) 

INSERT @Numbers VALUES('1')
INSERT @Numbers VALUES('12')
INSERT @Numbers VALUES('123')
INSERT @Numbers VALUES('1234')
INSERT @Numbers VALUES('12345')
INSERT @Numbers VALUES('123456')
INSERT @Numbers VALUES('1234567')
INSERT @Numbers VALUES('12345678')   

SELECT RIGHT(REPLICATE('0', 8) + CONVERT(NVARCHAR(8),Num),8) FROM @Numbers

这将导致:

00000001
00000012
00000123
00001234
00012345
00123456
01234567
12345678

答案 1 :(得分:3)

不要这样做!将值存储为INT。如果你使用字符串,你将永远被困零填充。如果你决定将零存储在字符串中,你仍然需要用零填充用户输入来查询它(或使用像'%'+ @ x +'%',yikes!)

答案 2 :(得分:1)

您可以将NVARCHAR CAST到INT,然后按照您的意愿进行排序。我假设订单号只包含数字字符。

ORDER BY
    CAST(OrderNumber AS INT)

答案 3 :(得分:1)

我偶然发现了这一点,我知道它已经被问过很久了,但是因为我知道一个不同的,可能更简单的解决方案,所以我决定分享。

注意:这仅适用于您要填充的列仅包含数字字符。这是因为STR()函数将float作为第一个参数,并且在再次转换为更长的字符串之前,任何字符串都将转换为float。

基本上 - 这个:

SELECT REPLACE(STR('872', 8), ' ', '0')

将输出 00000872

答案 4 :(得分:0)

这基本上是对pcampbell给出的答案的重写,但是使用我发现更容易移植到其他SQL产品的函数:CAST而不是CONVERT等:

SELECT CAST(REVERSE(CAST(REVERSE(CAST(Num AS NVARCHAR(9))) + '000000000' AS NCHAR(9))) AS NVARCHAR(9))
       AS value_padded
 FROM Numbers;