繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM