[英]How do you pad a NVARCHAR field with zeros using T-SQL in a SQL Server 2005 DB?
我有一个订单表,将订单号存储为NVarChar。 我们通过查询降序排列的最大订单号并返回前1个然后加1,来手动增加订单号。我们已经在Microsoft CRM 4.0中实现了这一点。
例如订单号(NVarchar)
99
456
32
当我查询上述值时,它返回99而不是456。我想在SQL Server 2005中使用sql脚本将所有当前订单号填充到000099或000456之类的内容。
000099
000456
000032
为此,我必须编写什么SQL脚本?
这是有关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
不要这样! 将值存储为INT。 如果您使用字符串,将永远被零填充。 如果您决定将零存储在字符串中,则仍然必须在用户输入中填充零以进行查询(或使用类似'%'+ @ x +'%'的方式!)
您可以将NVARCHAR转换为INT,然后按需要进行排序。 我假设订单号仅包含数字字符。
ORDER BY
CAST(OrderNumber AS INT)
我只是偶然发现了这一点,并且我知道它已经问了很久了,但是由于我知道一个不同的,可能更简单的解决方案,因此我决定分享一下。
注意:这仅适用于您要填充仅包含数字字符的列 。 这是由于这样的事实,即STR()函数将float用作第一个参数,并且所有字符串在再次转换为更长的字符串之前都将转换为float。
基本上-这个:
SELECT REPLACE(STR('872', 8), ' ', '0')
将输出00000872
这基本上是对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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.