2017-05-09 63 views
5

Próbuję utworzyć kolumnę obliczoną w programie SQL Server.Próba utworzenia kolumny obliczeniowej w SQL Server

To jest skrypt do tworzenia kolumny.

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 

To zwróci wartość InvoiceId kolumny tak:

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 

Ale chcę, aby zmodyfikować go więcej.

Kiedy serwer data zmiany, a następnie ponownie rozpocząć od 1.

To mój oczekiwany wynik.

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 

Jak widać z wyżej rezultacie znowu zacząć od gdzie data zmiana do .

Jeśli nie można tego zrobić przy użyciu kolumny obliczeniowej, to czy istnieje inny sposób, w jaki mogę to osiągnąć.

Wiem, że istnieje wiele postów związanych z tworzeniem kolumny obliczeniowej. Ale nie wiem, jak zrobić to ponownie, zaczynając od 1, gdy data się zmienia.

+0

Czy możesz utworzyć funkcję zwracającą liczbę faktur z dniami? – apc

+0

@apc: Nie dostałem cię. co masz na myśli przez liczbę dni. –

+0

Nie sądzę, można to osiągnąć za pomocą kolumn obliczeniowych.możesz użyć widoku – TheGameiswar

Odpowiedz

1

Jestem z TheGameiswar na ten temat. Myślę, że widok (lub proste zapytanie) byłaby najlepsza

Przykład

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 

Zwraca

enter image description here

Po aktualizacji

enter image description here

+0

Czy nie powinieneś mieć identyfikatora jako zamówienia drugorzędnego na podstawie numeru wiersza lub czy będzie on w 100% unikalny w 100%? – xQbert

+0

@xQbert Dobra rozmowa ... Dokonam aktualizacji –

+0

Ryzyko jest niewielkie, ale nie chciałbym, aby numery faktur zmieniały się na identyfikatorze ... który prowadziłby do poważnych bólów głowy; chociaż nie lubię tego obliczać w locie. Po przypisaniu numeru faktury należy go wykonać i nie zmieniać. Wolałbym to uruchamiać przy tworzeniu i po wygenerowaniu wartość nigdy nie powinna się zmienić (szczególnie po wysłaniu do klienta!) – xQbert