Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc

SQL: Mały problem i pytanie (jak pobrać ID wstawionych wierszy)

Spotkałem się dziś z małym problemem, który nie do końca wiem jak rozwiązać (zrobiłem pewne obejście, ale mi się nie podoba).

Mam tabelę dokumentów (D), tabelę elementów tych dokumentów (E) oraz tabelę pewnych dodatkowych informacji o tych elementach (R). Relacje wyglądają następująco: R --FK--> E --FK--> D.

A teraz zadanie:
- Należy scalić pewny zbiór dokumentów z (D) - nagłówki scalamy w jakiś sposób (to nas nie interesuje)
- W wynikowym dokumencie mają się znaleźć elementy (E) z wszystkich scalanych dokumentów
- Dodatkowe informacje z (R) mają zostać skopiowane i przypisane do odpowiednich elementów wynikowego dokumentu
- Dokumenty źródłowe mają pozostać w niezmienionej formie

Moja procedura iteruje sobie po dokumentach do scalenia. Najpierw scala nagłówek (D) kolejnego przetwarzanego dokumentu a następnie ma za zadanie skopiować elementy tego dokumentu do dokumentu wynikowego. Problem pojawia się z jednoczesnym skopiowaniem elementów (E) jak i informacji rozszerzonych (R). Chciałbym jednym insertem załatwić kopię elementów dokumentu a następnie drugim kopię informacji rozszerzonych. Niestety po krótkich poszukiwaniach nie znalazłem rozwiązania na pobranie identyfikatorów wstawionych wierszy (da się w ogóle?). Najszybszym rozwiązaniem byłby kursor, ale chciałbym uniknąć kolejnego.

Najpierw pomyślałem o modyfikowalnym widoku (ang. updatable view), tak aby jednym insertem wrzucić element i info rozszerzone, ale że nigdy tego nie robiłem, to szybko okazało się, że oczywiście można wstawiać wartości do takiego widoku, nawet jeżeli składa się z wielu połączonych tabel (w moim przypadku join między E i R), ale tylko w przypadku, gdy operacja wstawiania dotyczy kolumn tylko jednej z tabel (czyli już nie dla mnie). O pozostałych wymaganiach co do modyfikowalnych widoków można poczytać na stronie MSDN w podpunkcie o tytule updatable views. Można też zrobić triggera instead of insert dla tego widoku i w nim zająć się odpowiednim wstawianiem wartości, ale trigger to dla tego problemu chyba armata...

Może macie jakieś pomysły? Na pewno!

Doprecyzowanie zadania:
Kolumny (duże uproszczenie):
Tabela D: ID, Data
Tabela E: ID, FK_D, Kwota
Tabela R: ID, FK_E, Info

Dane:
Tabela D:
1, 12/01/2007
2, 13/01/2007

Tabela E:
1, 1, 23.4
2, 1, 1.1
3, 2, 45.32
4, 2, 1.0

Tabela R:
1, 1, 'Info'
2, 2, 'Ala'
3, 3, 'Info inne'
4, 4, 'Kot'

Po scaleniu dokumentów 1 i 2 z D powstają dodatkowe wiersze w odpowiednich tabelach (dla nagłówka datę bierzemy najwcześniejszą)
Tabela D:
3, 12/10/2007

Tabela E:
5, 3, 23.4
6, 3, 1.1
7, 3, 45.32
8, 3, 1.0

Tabela R:
5, 5, 'Info'
6, 6, 'Ala'
7, 7, 'Info inne'
8, 8, 'Kot'

Pracuję na SQL Server 2005. :)
Opublikowane 26 października 2007 18:59 przez nuwanda
Filed under: ,

Komentarze:

# re: SQL: Mały problem i pytanie (jak pobrać ID wstawionych wierszy)

26 października 2007 22:59 by ucel

Jeśli wstawienie nowego wiersza spowodowało automatyczne wygenerowanie ID dla tego wiersza, to wartość tę można pobrać za pomocą instrukcji

SELECT @@IDENTITY

Więcej informacji na ten temat tutaj: http://msdn2.microsoft.com/en-us/library/ms187342.aspx

# re: SQL: Mały problem i pytanie (jak pobrać ID wstawionych wierszy)

26 października 2007 23:50 by nuwanda

Tak, zgadza się, ale tak jak zaznaczyłem elementów danego dokumentu może być więcej, zatem @@identity ani scope_identity() nie dają rady.

# re: SQL: Mały problem i pytanie (jak pobrać ID wstawionych wierszy)

27 października 2007 11:35 by wojtek obst

Nie wiem czy dobrze rozumiem problem, może postarałbyś wypisać jakiś konkretny przykład, wtedy chyba byłoby bardziej przejrzyście.

I powiedz jaka wersja SQL Servera! W 2005 jest coś takiego jak WITH (zwane jest to to wyrażeniami tablicowymi - CTO). Może będzie pomocne?

# re: SQL: Mały problem i pytanie (jak pobrać ID wstawionych wierszy)

27 października 2007 12:40 by nuwanda

Uzupełniłem notkę o mały przykład.

Krótki opis wyrażeń tablicowych znalazłem (http://www.centrumxp.pl/dotNet/352,1,17_Nowo%C5%9Bci_w_SQL_Server_2005.aspx) i coś mi się wydaje, że będą bardzo pomocne. Jak tylko znajdę czas to się im przyjrzę :) A teraz czas odkrywać Lyon :) Udanego weekendu!

# re: SQL: Mały problem i pytanie (jak pobrać ID wstawionych wierszy)

27 października 2007 17:35 by chrisu

Jeśli chodzi o pobranie kolekcji identyfikatorów nowych wierszy, można skorzystać z polecenia INSERT z opcją OUTPUT, która pozwala przenieść dane nowych wierszy do tabeli tymczasowej. Do nowych wierszy można odwołać się używając nazwy INSERTED, np.:

DECLARE @table TABLE (id int);

INSERT INTO E(FK_D, Kwota)

 OUTPUT INSERTED.ID INTO @table

 SELECT FK_D, Kwota FROM E WHERE...

Po wykonaniu takiej operacji do tabeli E dodane zostaną nowe wiersze, a w tabeli @table znajdą się identyfikatory nowych elementów.

Nie wiem jednak jak na podstawie tych id przenieść powiązane z nimi informacje :)

Więcej informacji i przykładów można znaleźć w dokumentacji sql server 2005 pod hasłem "OUTPUT clause".

# re: SQL: Mały problem i pytanie (jak pobrać ID wstawionych wierszy)

28 października 2007 01:33 by nuwanda

Super! Czyli istnieje sposób na pobranie identyfikatorów wstawionych wierszy :D. Tego na początku szukałem. Doczytałem więcej (http://msdn2.microsoft.com/en-us/library/ms177564.aspx). Nie miałem pojęcia o takiej możliwości. Miło jest  dowiedzieć się nowych rzeczy :). Dzięki.

Komentarze anonimowe wyłączone