【问题标题】:How to add Leading Zeros in Sequence in SQL Server 2012?如何在 SQL Server 2012 中按顺序添加前导零?
【发布时间】:2016-04-01 14:49:04
【问题描述】:

我的表中有一个列,即 TieBreaker,它只接受 4 位数的长度值。

我写了一个 SQL SEQUENCE 来生成一个系列:

/* 要删除现有序列的片段*/

IF EXISTS 
    (
       SELECT * FROM Sys.Sequences WHERE Name = 'TieBreaker'
    )   DROP SEQUENCE TieBreaker
GO

/* 用于创建序列的片段*/

CREATE SEQUENCE TieBreaker AS INT
 START WITH 0000
 INCREMENT BY 1
 MINVALUE 0000
 MAXVALUE 9999
 CYCLE
 GO

如何为我的序列输出前导 0?如下:

【问题讨论】:

  • 什么意思?您的 SEQUENCE 以 1000 开始并以 9999 结束?
  • @PeterRing 刚刚更新了我的问题,请再次查看!

标签: sql sql-server sql-server-2012 sequence


【解决方案1】:

你没有。正如我们在学校所学的那样,数字没有前导零。

字符格式有。所以你有3个选择:

  • 将字段设为 varchar。这并不是完全关闭的,因为许多数字序列也有前缀并且不是数字。

  • 添加另一个计算字段来格式化输出,以便您可以使用它。

  • 不在乎数据库级别,而是在使用它的任何程序中格式化。

【讨论】:

  • 由于 SQL Server 不允许我们在序列中使用 Varchar 数据类型,我尝试使用另一个计算列,但我的脚本正在连接其他 2 个计算列,因此 SQL 不允许我使用它们. SQL SERVER 的错误消息:消息 1759,级别 16,状态 0,第 2 行表“#NonMon”中的计算列“D_Tie Breaker”不允许在另一个计算列定义中使用。
  • 嗯,是的。我确定您无法编写触发器或其他东西来从序列中获取数值,对其进行格式化并将其放入插入的行中?
  • 我创建了一个列序列号,将序列的输出插入其中。然后我有另一个 UPDATE 语句在其中插入正确的值......它不是最好的解决方案,但它设法完成了工作!谢谢!
【解决方案2】:

使用计算列进行格式化的示例

CREATE TABLE Test (
  TieBreakerSeq INT DEFAULT NEXT VALUE FOR TieBreaker,
  TieBreakerAsChar AS FORMAT(TieBreakerSeq, '0000#'),
  SomeOtherData VARCHAR(10)
)

INSERT INTO Test (SomeOtherData) VALUES ('A'),('B'),('C')

SELECT * FROM Test

TieBreakerSeq TieBreakerAsChar SomeOtherData
------------- ---------------- -------------
0             00000            A
1             00001            B
2             00002            C

【讨论】:

  • 感谢您的回答,它非常完美。但是当我使用#TempTable 时,我收到一个错误,即无效的对象名称“TieBreaker”。CREATE TABLE #Test (TieBreakerSeq INT, TieBreakerAsChar AS FORMAT(TieBreakerSeq, '0000#'), SomeOtherData VARCHAR(10), ) INSERT INTO #Test (TieBreakerSeq, SomeOtherData) 为 TieBreaker 选择下一个值, 'C'
  • 我不知道 TieBreakerAsChar AS FORMAT(TieBreakerSeq, '0000#'),它会改进我的代码..太棒了..再次感谢您!
  • 另一种方法:SELECT RIGHT ('0000' + CAST (NEXT VALUE FOR Invoice_Seq AS VARCHAR(5)), 4);
【解决方案3】:

你试过了吗

select lpad(TieBreaker.nextval,'4','0') from dual;

它会给出相同的结果吗?

0000
0001
0002 and so on.. 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    相关资源
    最近更新 更多