尝试在SQL Server中创建计算列

时间:2017-05-09 13:31:28

标签: sql sql-server tsql

我正在尝试在SQL Server中创建一个计算列。

这是创建列的脚本。

CREATE TABLE [dbo].[Invoice]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [InvoiceID] AS (('INV' + FORMAT(GETUTCDATE(), 'yyyyMMdd')) + RIGHT('000000' + CONVERT([VARCHAR](20), [ID]), (7))),
    [Name] [nvarchar](50) NOT NULL,
    [CreatedOn] [datetime] NOT NULL 
         CONSTRAINT [DF_Invoice_CreatedOn]  DEFAULT (getutcdate())
) ON [PRIMARY]
GO

它将返回InvoiceId列的值,如下所示:

ID  InvoiceID            Name    CreatedOn
--- -------------------- ------- -----------------------
1   INV201705090000001   amki    2017-05-09 13:11:06.790
2   INV201705090000002   amkit   2017-05-09 13:11:26.600
3   INV201705090000003   amkit3  2017-05-09 13:11:32.397
4   INV201705090000004   amkit6  2017-05-09 13:11:35.070

但我想更多地修改它。

当服务器日期改变时,它再次从1开始。

这是我的预期输出。

ID  InvoiceID            Name    CreatedOn
--- -------------------- ------- -----------------------
1   INV201705090000001   amki    2017-05-09 13:11:06.790
2   INV201705090000002   amkit   2017-05-09 13:11:26.600
3   INV201705090000003   amkit3  2017-05-09 13:11:32.397
4   INV201705100000001   amkit6  2017-05-10 13:11:35.070
5   INV201705100000002   amkit6  2017-05-10 13:11:35.070
6   INV201705110000001   amkit6  2017-05-11 13:11:35.070

从上面的结果可以看出,它再次从 1 开始,其中日期从 20170509 变为 20170510

如果无法使用计算列完成,那么还有其他任何方法可以实现此目的。

我知道有很多关于如何创建计算列的帖子。但是,如果日期发生变化,我不会再从1开始。

1 个答案:

答案 0 :(得分:1)

我和 TheGameiswar 就是这个。我认为一个视图(或简单的查询)是最好的

示例

Select ID
      ,Invoice = concat('INV',convert(varchar(8),CreatedOn,112),right('0000000'+convert(varchar(5),Row_Number() over (Partition By convert(date,CreatedOn) Order by CreatedOn,ID)),7))
      ,Name
      ,CreatedOn
 From  YourTable

退货

enter image description here

更新后

enter image description here