2017-05-09 63 views
5

我想在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

回答

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

+0

您是否應該將ID作爲次級訂單在Row_Number上進行創建,或者在100%的時間內創建爲100%唯一ID? – xQbert

+0

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

+0

風險很小,但我不希望發票號碼在ID上發生變化......這會導致一些主要的頭痛;儘管我不喜歡在飛行中對此進行計算。一旦發票號碼被分配,它應該是完成,而不是改變。我更喜歡創建這個觸發器,並且一旦生成值應該永遠不會改變(特別是一旦發送給客戶!) – xQbert