Marek Z.

Marek Z. Programista

Temat: Automatyczne numerowanie (sql server)

Witam, chciałem sobie utworzyć automatyczne numerowanie wprowadzanych dokumentów. Wszystkie rozwiązania jakie znalazłem wykorzystywały id rekordu do numeracji dokumentów czyli dla id=1 nr dokumentu był D0001, id=2 D0002. W moim przypadku to rozwiązanie odpada bo kolumna id jest typu UNIQEIDENTIFIER.

Postanowiłem to rozwiązać numerowaniem wierszy czyli dla wiersza 1 nr dokumentu jest D0001, dla wiersza 2 D0002 itd.

Napisałem funkcję która ma to realizować i gdy dodaję pierwszy rekord to nr dokumentu jest ok czyli D0001, gdy dodam drugi dostaję błąd:

No row was updated. The data in row 2 was not committed. Error Source: Net SqlClient Data Provider. Error message: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <=, >, >= or when the subquery is used as expression.

Będę wdzięczny za pomoc i wytłumaczenie dlaczego tak się dzieje.
Kod funkcji:

CREATE FUNCTION NumerDokumentu()
RETURNS CHAR(5)
AS
BEGIN
DECLARE @NrWiersza INT
SET @NrWiersza = (SELECT ROW_NUMBER() OVER (ORDER BY Tytul) FROM Tabela

RETURN 'D' + '000' + CONVERT(VARCHAR(10), @NrWiersza)
END
Marek Zając edytował(a) ten post dnia 08.06.11 o godzinie 16:02

konto usunięte

Temat: Automatyczne numerowanie (sql server)

declare @NrWiersza int

; with W as (
SELECT (ROW_NUMBER() OVER (ORDER BY tytul)) as t FROM produkty
)
SELECT @NrWiersza = max(t) FROM w
select @NrWiersza
Przemysław R. edytował(a) ten post dnia 08.06.11 o godzinie 16:09

konto usunięte

Temat: Automatyczne numerowanie (sql server)

Marek Zając:
Napisałem funkcję która ma to realizować
Twoje rozwiązanie ma zasadniczą wadę - dopuszcza kolizje. To znaczy może się zdarzyć, że jeśli dwie niezależne transakcje jednocześnie wywołają funkcję NumerDokumentu, to dwa różne dokumenty otrzymają taki sam numer. Lepiej użyj pola typu IDENTITY, które służy właśnie to takich celów.

konto usunięte

Temat: Automatyczne numerowanie (sql server)

1. Dlaczego przy tworzeniu 'numeru' dokumentu używasz ROW_NUMBER() zamiast Count() ?

2. Dlaczego numerujesz po tytule (jak rozumiem taka jest intencja) ?
Czy pomyślałeś o sytuacji, kiedy ktoś najpierw doda dokument 'Bardzo brzydki kod', a później 'Absolutnie fantastyczny kod ' ? :)Jakub Wojt edytował(a) ten post dnia 09.06.11 o godzinie 10:30

konto usunięte

Temat: Automatyczne numerowanie (sql server)

Napisałem funkcję która ma to realizować
Twoje rozwiązanie ma zasadniczą wadę - dopuszcza kolizje. To znaczy może się zdarzyć, że jeśli dwie niezależne transakcje jednocześnie wywołają funkcję NumerDokumentu, to dwa różne dokumenty otrzymają taki sam numer. Lepiej użyj pola typu IDENTITY, które służy właśnie to takich celów.

Jeśli funkcja będzie wywoływana tylko w INSERT'ach, nie ma takiego niebezpieczeństwa.

http://msdn.microsoft.com/en-us/library/ms174335.aspx
http://msdn.microsoft.com/en-us/library/ms175519.aspx
Marek Z.

Marek Z. Programista

Temat: Automatyczne numerowanie (sql server)

Jakub Wojt:
1. Dlaczego przy tworzeniu 'numeru' dokumentu używasz ROW_NUMBER() zamiast Count() ?

2. Dlaczego numerujesz po tytule (jak rozumiem taka jest intencja) ?
Czy pomyślałeś o sytuacji, kiedy ktoś najpierw doda dokument 'Bardzo brzydki kod', a później 'Absolutnie fantastyczny kod ' ? :)
Po prostu chciałem uzyskać nr kolejnego wiersza, a co do numeracji po tytule to tak tylko napisałem do testów. Chodziło mi o rozwiązanie samego numerowania.

Zrobiłem tak jak radził Tomasz Kupczyk, po prostu użyłem IDENTITY do numeracji.
Patryk J.

Patryk J. GMC Inspire Designer

Temat: Automatyczne numerowanie (sql server)

Marek Zając:
Będę wdzięczny za pomoc i wytłumaczenie dlaczego tak się dzieje.
Kod funkcji:


SET @NrWiersza = (SELECT ROW_NUMBER() OVER (ORDER BY Tytul) FROM Tabela

ponieważ próbujesz pod zmienną @NrWiersza podstawić więcej niż jedną wartość, którą uzyskujesz z podzapytania po znaku równościPatryk Jabłoński edytował(a) ten post dnia 12.06.11 o godzinie 12:21

Następna dyskusja:

Klastrowanie w SQL Server




Wyślij zaproszenie do