migracja danych z tabeli

migracja danych z tabeli
K3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Witam serdecznie.

Mam SSMS i 2 bazy danych w T-SQL.
1 archiwum
2 test

mam tabelę w Archiwum TABLE
chciałbym przenieść wszystkie wartości z tej tabeli do bazy Test.
Struktura bazy jest taka sama, chodzi tylko jak to najlepiej zrobić.

Prosiłbym o jakąś wskazówkę :)
Pozdrawiam

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
2

Mam SSMS i 2 bazy danych w T-SQL.

3 błędy w jednym zdaniu:

  • SSMS to narzędzie do łączenia się z SQL Serverem
  • bazy masz na SQL serverze nie w tsql
  • tsql to dialect SQL-a używany przez MS SQL Server

najprosciej przeniesc dane tak:

Kopiuj
insert into test.dbo.[table]
select * from archiwum.dbo.[table]
BlackBad
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 454
0

Np tak:

Kopiuj
INSERT INTO table2
SELECT * FROM table1
WHERE condition; 

https://www.w3schools.com/sql/sql_insert_into_select.asp

UglyMan
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2206
0

Możesz użyć generate script (https://docs.microsoft.com/en-us/sql/ssms/tutorials/scripting-ssms?view=sql-server-ver15) jak bazy nie stoją na jednym serwerze.

K3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Tak macie rację, sorry.
Ogólnie tak jak pisałem. Mam dwie bazy, a każdej z nich taką samą tabelę TABLE, z tym że w bazie Archiwum mam rekordy natomiast w Test ich nie mam i chciałbym je tam skopiować.
Posłużyłem się powyższym skryptem napisanym przez Panczo.
Mam błąd:
Msg 8101, Level 16, State 1, Line 4
An explicit value for the identity column in table 'Archiwum.cdn.TABLE' can only be specified when a column list is used and IDENTITY_INSERT is ON.
screenshot-20191216185219.png

Mam wrażenie że chodzi o te klucze na tabeli, aaalbo nie wiem.

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
1

Komunikat mówi tylko o tym, że tabela do której kopiujesz ma kolumne identity, a do niej nie można wstawić danych, tzn mzna, ale świadomie, obejście:

musisz wylistować wszystkie kolumny bez kolumny identity:

Kopiuj
insert into test.dbo.[table] (DAtKod, Dat_Daid)
select DAtKod, Dat_Daid from archiwum.dbo.[table]

oczywiście tu musza byc wszystkie kolumny poza tą jedną, zakładam, że to PK.

Drugi sposób to włączenie opcji IDENTITY_INSERT

Kopiuj
SET IDENTITY_INSERT test.dbo.[table] ON; 

insert into test.dbo.[table]
select * from archiwum.dbo.[table]

SET IDENTITY_INSERT test.dbo.[table] OFF; 

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-identity-insert-transact-sql?view=sql-server-ver15

Z ciekawości, po co to kopiujesz? widać, że to jakieś rozwiązanie comarch-a, wnioskuje że chcesz mieć bazę do testów, normalnie robi się to przez backup bazy produkcyjnej i restore na testowej....

K3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Gdy próbuję pierwszy sposób

mam jakiś konflikt z foreign key, on się odwołuje do jakiś innych tabel ..

Gdy próbuje drugi sposób mam cały czas ten sam komunikat.

ustawiam moją pustą bazę na ON:
SET IDENTITY_INSERT Test.cdn.Table ON;

insert into Test.cdn.Table
select * from Archiwum.cdn.Table

SET IDENTITY_INSERT Test.cdn.Table OFF;

Sam SET mi się niby ustawia, ale cały skrypt wyrzuca ten sam błąd:

Msg 8101, Level 16, State 1, Line 4
An explicit value for the identity column in table 'Test.cdn.Table' can only be specified when a column list is used and IDENTITY_INSERT is ON.

Jak powinny być ustawione te IDENTITY? Testowa baza powinna być na ON a po wykonaniu insertu z powrotem na OFF?

A robię to z czystej ciekawości, jestem ciekaw na ile jest się w stanie zaingerować w taką bazę.

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
0

zapomniałem, przy włączonym identity_insert musisz wypisać kolumny

Kopiuj
SET IDENTITY_INSERT test.dbo.[table] ON; 

insert into test.dbo.[table] (kolumny)
select kolumny from archiwum.dbo.[table]

SET IDENTITY_INSERT test.dbo.[table] OFF; 

jak do testow to ok, produkcyjnie spore ryzyko, nie mam doświadczenia z comarchem, ale "wgryzałem" się już w kilka baz i zawsze to było ciężkie

UglyMan
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2206
0

Łączenie danych z wielu baz zawsze jest trudne ze względu na zależność i klucze. Jak potrzebujesz bazy testowej, to robisz kopie z proda i tyle, jak napisał @Panczo. Jak chcesz to zrobić po twojemu, to ja bym zmigrował tabelkę do jakieś nowej tabeli, a potem napisał kawek T-SQL, który to wrzuci "inteligentnie" do właściwej tabeli - np sprawdzi klucze.

SH
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 109
0

Z tego co mówisz to tabele są 1:1 i sypie się obecnie na kluczach. Nie wiem jak w MSSQL działa cały mechanizm, ale w oracle da radę wyłączyć wszystkie constrainty, zainsertować bez problemu wszystkie dane i wtedy je włączyć i sprawdzić czy wstaną. Skoro przenosisz dane 1:1 to problemu nie powinno być, o ile uwzględnisz wszystkie relacje. Obecnie jak masz włączone zależności nie zainsertujesz nic, jeśli będziesz próbował to robić na poziomach wyższych niż najniższy, czyli musisz zacząć od tabel podrzędnych, które nie mają żadnych kluczy obcych i lecieć w górę.

K3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Dzięki za pomoc. Ogólnie wziąłem sobie na początek za cel zbyt skomplikowaną tabelę, która ma powiązania klucze i triggery.

Musiałbym, o ile się da, powyłączać to wszystko i wtedy spróbować.

Ostatecznie graniczyłem się do nowej tabelki z prostymi danymi i przeszło

Kopiuj
insert into CDN_Demo_2.dbo.AA (b)
select b from CDN_Demo.dbo.AA

screenshot-20191217144058.png

BlackBad
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 454
1

To już tak tylko z kronikarskiego obowiązku. Jeśli chcesz robić kopię jakiejś tabeli to nie musisz jej najpierw tworzyć i później kopiować dane. Możesz stworzyć od razu tabelę z danymi zbliżonym skryptem jaki już znasz mianowicie:

Kopiuj
SELECT * INTO CDN_Demo_2.dbo.AA
FROM CDN_Demo.dbo.AA

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.