试图在SQL Server中创建一个计算列

问题描述:

我想在SQL Server中创建一个计算列。试图在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开始。

+0

您能否创建一个函数来返回天数发票的计数? – apc

+0

@apc:我没有得到你。你算什么意思? –

+0

我不认为,这可以通过计算列来实现。您可以使用视图 – TheGameiswar

我与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

+0

您是否应该将ID作为次级订单在Row_Number上进行创建,或者在100%的时间内创建为100%唯一ID? – xQbert

+0

@xQbert良好的呼叫...我会做出更新 –

+0

风险很小,但我不希望发票号码在ID上发生变化......这会导致一些主要的头痛;尽管我不喜欢在飞行中对此进行计算。一旦发票号码被分配,它应该是完成,而不是改变。我更喜欢创建这个触发器,并且一旦生成值应该永远不会改变(特别是一旦发送给客户!) – xQbert