【问题标题】:Combining strings with formatted numbers while incrementing by one将字符串与格式化数字组合,同时递增一
【发布时间】:2021-06-07 12:23:22
【问题描述】:

我试图用零填充@myid,但零没有出现。结果应采用这种格式(SC000290、SC000291 等)。显示的是 SC290。谁能告诉我这是怎么做到的?

declare @myid int;
select @myid = 290

SELECT CONCAT('SC', FORMAT(@myid, '000000') + ROW_NUMBER() OVER(order by (select NULL))) as myid
FROM Table

【问题讨论】:

  • 我可以看到该查询中没有bigints。唯一存在隐式 covnerion 的地方是 FORMATROW_NUMBERFORMAT 返回 varcharROW_NUMBERintFORMAT 也完全没有意义,因为该值将被隐式转换为 int,删除所有前导零。
  • 这里有答案吗,还是你只是给出解释?
  • 那里没有答案,因为您提供的代码不会产生那个错误,@FirstElement。 db<>fiddle 花时间发布minimal reproducible example
  • 事实上,上面的代码会因为错误而失败 "'FORMAT' is not a known built-in function name." FORMAT 在 SQL Server 2012 中引入,并且您使用的是 SQL Server 2008(顺便说一下,它现在完全不受支持 18~ 个月,所以很久以前就可以对升级路径进行排序了)。
  • 你应该阅读data type precedence。它解释了为什么将字符串与int (FORMAT(@myid, '000000') + ROW_NUMBER()) 组合会导致int

标签: sql tsql sql-server-2008


【解决方案1】:

我个人会避免使用FORMAT,它是一个缓慢的功能,并且在您使用的SQL Server 版本中不可用;正如我在 cmets 中所说:

FORMAT 是在 SQL Server 2012 中引入的,而您正在使用 SQL Server 2008(顺便说一下,它现在已经完全不支持了 18~ 个月,所以很久没有整理升级路径了)。

相反,您可以使用RIGHT 来获得您想要的值,这将适用于您正在使用的版本,并且在较新的版本上不会像FORMAT 那样昂贵:

SELECT 'SC' + RIGHT(CONCAT('000000', ROW_NUMBER() OVER (ORDER BY (SELECT NULL))),6) --YOu should really use a proper column, not (SELECT NULL)
       {Other Columns}
FROM dbo.YourTable;

【讨论】:

    【解决方案2】:

    问题在于row_number() 返回一个int,所以+ 是整数加法,而不是字符串连接。所以,一直使用concat()

    SELECT CONCAT('SC', 
                  FORMAT(@myid, '000000'),
                  ROW_NUMBER() OVER (order by (select NULL))
                 ) as myid
    FROM Table
    

    【讨论】:

      猜你喜欢
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 2022-07-05
      • 2010-10-16
      • 2012-08-20
      相关资源
      最近更新 更多