【问题标题】:How do you pad a NVARCHAR field with zeros using T-SQL in a SQL Server 2005 DB?如何在 SQL Server 2005 DB 中使用 T-SQL 将 NVARCHAR 字段填充为零?
【发布时间】:2009-07-10 18:52:13
【问题描述】:

我有一个将 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 脚本来完成此操作?

【问题讨论】:

  • 与其解决元问题,为什么不直接使用数字类型而不是 varchar 来消除问题的根源而不是症状?

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


【解决方案1】:

这是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

【讨论】:

  • 应该是问题中指定的 NVARCHAR。
  • 我也会考虑使用 REPLICATE('0', 8) 而不是文字字符串 '00000000'
【解决方案2】:

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

【讨论】:

  • 在这种特殊情况下,NVarchar 是我们在 CRM 4.0 中的唯一选择,否则我们首先会使用整数。
【解决方案3】:

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

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

基本上 - 这个:

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

将输出00000872

【讨论】:

    【解决方案4】:

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

    ORDER BY
        CAST(OrderNumber AS INT)
    

    【讨论】:

      【解决方案5】:

      这基本上是对 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;
      

      【讨论】:

        猜你喜欢
        • 2010-09-23
        • 2015-01-30
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 2020-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多