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. :)