我有一个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脚本?
答案 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;