2

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

例如订单号 (NVarchar)

99
456
32

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

000099
000456
000032

我必须编写什么 SQL 脚本才能完成此操作?

4

5 回答 5

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
于 2009-07-10T18:54:23.770 回答
3

不要这样做!将值存储为 INT。如果您使用字符串,您将永远被零填充。如果您决定将零存储在字符串中,您仍然必须用零填充用户输入以查询它(或使用类似 '%'+@x+'%',哎呀!)

于 2009-07-10T19:13:13.653 回答
2

我只是偶然发现了这个,我知道很久以前就有人问过这个问题,但是因为我知道一个不同的,可能更简单的解决方案,所以我决定分享。

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

基本上 - 这个:

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

将输出00000872

于 2013-01-17T11:35:52.503 回答
1

您可以将 NVARCHAR 转换为 INT,然后按照您的需要进行排序。我假设订单号仅包含数字字符。

ORDER BY
    CAST(OrderNumber AS INT)
于 2009-07-10T19:17:32.990 回答
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;
于 2009-07-11T09:31:05.733 回答