Moja baza danych zawiera trzy tabele o nazwie Object_Table
, Data_Table
i Link_Table
. Tabela połączeń zawiera tylko dwie kolumny, tożsamość rekordu obiektu i tożsamość rekordu danych.
Chcę skopiować dane, DATA_TABLE
skąd są połączone z jedną podaną tożsamością obiektu i wstawić odpowiednie rekordy do Data_Table
i Link_Table
dla innej podanej tożsamości obiektu.
Mogę to zrobić, wybierając zmienną tabeli i przechodząc w pętlę, wykonując dwa wstawienia dla każdej iteracji.
Czy to najlepszy sposób na zrobienie tego?
Edycja : Chcę uniknąć pętli z dwóch powodów, po pierwsze, że jestem leniwy, a tabela pętli / temp wymaga więcej kodu, więcej kodu oznacza więcej miejsc do popełnienia błędu, a drugim powodem jest obawa o wydajność.
Mogę skopiować wszystkie dane w jednej wstawce, ale jak sprawić, by tabela linków łączyła się z nowymi rekordami danych, w których każdy rekord ma nowy identyfikator?
źródło
Odpowiedzi:
Jednym słowem : Nie.
W jednej transakcji : tak
Dobrą wiadomością jest to, że powyższy kod ma również gwarancję, że jest atomowy i może być wysłany na serwer z aplikacji klienckiej z jednym ciągiem sql w pojedynczym wywołaniu funkcji, tak jakby to była jedna instrukcja. Możesz również zastosować wyzwalacz do jednej tabeli, aby uzyskać efekt pojedynczego wstawienia. Jednak ostatecznie nadal są to dwie instrukcje i prawdopodobnie nie chcesz uruchamiać wyzwalacza dla każdej wstawki.
źródło
insert into ... select ...
oświadczenie. W jaki sposób powyższy kod odczytuje lub zapętla dane Object_Table. Nadal musisz użyć zmiennej tabeli, której pytający nie chciał zrobić.Nadal potrzebujesz dwóch
INSERT
instrukcji, ale wygląda na to, że chcesz pobraćIDENTITY
z pierwszej wstawki i użyć jej w drugiej. W takim przypadku możesz zajrzeć doOUTPUT
lubOUTPUT INTO
: http://msdn.microsoft.com/en- us / library / ms177564.aspxźródło
Poniżej przedstawiono sytuację, którą miałem, używając zmiennych tabeli.
Dzięki kolejnej odpowiedzi, która wskazała mi klauzulę OUTPUT, mogę zademonstrować rozwiązanie:
Okazuje się jednak, że w rzeczywistości nie jest to takie proste z powodu następującego błędu
Nadal mogę zrobić
OUTPUT INTO
stół tymczasowy, a następnie skończyć z normalną wkładką. Więc mogę uniknąć pętli, ale nie mogę uniknąć tabeli tymczasowej.źródło
Wygląda na to, że tabela Link zawiera wiele: wiele relacji między tabelą Object i tabelą danych.
Sugeruję użycie procedury składowanej do zarządzania transakcjami. Jeśli chcesz wstawić dane do tabeli obiektów lub danych, wykonaj wstawki, pobierz nowe identyfikatory i wstaw je do tabeli łączy.
Dzięki temu cała Twoja logika pozostaje zamknięta w jednym, łatwym do wywołania sproc.
źródło
Jeśli chcesz, aby działania były mniej lub bardziej atomowe, owinąłbym je w transakcję. W ten sposób możesz mieć pewność, że oba się wydarzyły lub oba nie wydarzyły się w razie potrzeby.
źródło
Możesz utworzyć widok, wybierając nazwy kolumn wymagane przez instrukcję wstawiania, dodać wyzwalacz INSTEAD OF INSERT i wstawić do tego widoku.
źródło
Chcę podkreślić używanie
dla transakcji MSSQL z wieloma instrukcjami sql.
Zobacz: https://msdn.microsoft.com/en-us/library/ms188792.aspx Zapewniają bardzo dobry przykład.
Tak więc ostateczny kod powinien wyglądać następująco:
źródło
Wstaw może działać tylko na jednym stole naraz. Wiele wstawek musi mieć wiele instrukcji.
Nie wiem, czy musisz wykonać pętlę przez zmienną tabeli - czy nie możesz po prostu użyć wstawienia masy do jednej tabeli, a następnie wstawienia masy do drugiej?
Przy okazji - domyślam się, że masz na myśli skopiowanie danych z Object_Table; w przeciwnym razie pytanie nie ma sensu.
źródło
Zanim będzie można wykonać wstawianie z wieloma tabelami w Oracle, można użyć sztuczki polegającej na wstawianiu do widoku, w którym zdefiniowano wyzwalacz INSTEAD OF, aby wykonać wstawianie. Czy można to zrobić w programie SQL Server?
źródło
źródło
// jeśli chcesz wstawić to samo co pierwsza tabela
// lub jeśli chcesz wstawić określone części pierwszej tabeli
// Wiem, że wygląda zbyt dobrze, żeby mieć rację, ale działa i możesz kontynuować dodawanie zapytania, po prostu zmień
Mam 17 tabel, w których to zadziałało.
źródło