migracja danych z tabeli

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

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:

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

Np tak:

INSERT INTO table2
SELECT * FROM table1
WHERE condition; 

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

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.

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.

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:

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

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

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ę.

0

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

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

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.

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ę.

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

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

screenshot-20191217144058.png

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:

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1