Spis treści:

Kategoria:IdentitySQL Server


Jak skopiować zawartość tabeli w SQL Server

Kopiowanie tradycyjne

Kopiowanie danych pomiędzy tabelami nie jest najczęściej zadaniem prostym. O ile przerzucenie danych z prostej tabeli do drugiej identycznej może być równoznaczne z napisaniem następującego zapytania:

INSERT INTO Tabela_2 SELECTFROM Tabela

... o tyle przeniesienie danych z tabeli, która ma kolumnę IDENTITY, nie jest już tak oczywiste. Wykonanie skryptu zaprezentowanego nieco wcześniej sprawi, że naszym oczom ukaże się komunikat następującej treści:

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

Tabela ma identity - co robić?

W takim przypadku trzeba skorzystać z opcji IDENTITY_INSERT. Jak się to robi? Aby przedstwić kompletny przykład stwórzmy sobie dwie identyczne tabele z kluczem głównym będącym jednocześnie IDENTITY.

CREATE TABLE [Identity]
(
ID int NOT NULL IDENTITY(1,1),
int,
int,
CONSTRAINT PK_ID PRIMARY KEY CLUSTERED(ID)
)

CREATE TABLE [Identity_2]
(
ID int NOT NULL IDENTITY(1,1),
int,
int,
CONSTRAINT PK_ID2 PRIMARY KEY CLUSTERED(ID)
)

Kolejny etap, to uzupełnienie tabeli danymi:

INSERT INTO [Identity] VALUES (1,1)
INSERT INTO [Identity] VALUES (2,2)
INSERT INTO [Identity] VALUES (3,3)
INSERT INTO [Identity] VALUES (4,4)
INSERT INTO [Identity] VALUES (5,5)
INSERT INTO [Identity] VALUES (6,6)
DELETE FROM [Identity] WHERE A=3

A na koniec operacja właściwa:

SET IDENTITY_INSERT [Identity_2] ON
INSERT INTO [Identity_2](ID,A,B) SELECT ID,A,B FROM [Identity]
SET IDENTITY_INSERT [Identity_2] OFF

Ważne w ostatniej operacji jest to, aby jawnie podać listę kolumn. Niedozwolone jest użycie *, chociaż w zwykłych zapytaniach jest to równoważne. Dość uciążliwe może być właśnie to jawne podawanie wszystkich kolumn, ale i na to jest sposób. Jak wygenerować sobie listę kolumn wyjaśnię innym razem, w oddzielnym wpisie.

Kategoria:IdentitySQL Server

, 2013-12-20

Komentarze:

pakamc (2017-06-21 12:09:24)
Mam pytanie o sposób wykonania czynności w ramach jednej tabeli.
Chciałbym skopiować zawartość kolumny X do kolumny Y.
Jakim sposobem najlepiej to wykonać ?
PD (2017-06-21 14:20:32)
Wystarczy najprostsza wersja instrukcji UPDATE:
UPDATE NazwaTabeli SET Y=X
Dodaj komentarz
Wyślij
Ostatnie komentarze
To samo pytanie co wyżej. Mam za zadanie dodać kolumnę do istniejącej tabeli łącząc obie inne kolumny ze sobą, ale nie mam pojęcia jak za to się zabrać
działa :) tylko była literówka :)
Podziękował. Trochę późno, po 8 latach, ale dzięki za testy (rozumiem że dla SQL2012 robione). Tak się właśnie zastanawiałem ile złego czynię stosując czasem __(max).
Super robota, korzystając z innych internetowych kalkulatorow po prostu wątpiłem w ich prawdomówność, w końcu trafiłem tutaj i wynik w końcu jest wiarygodny. 40 km w 2 h 810 kcal, ciekawostka: na fitatu wyliczyło mi 5700 kcal 😊 najlepiej będzie chyba jak kupię zegarek sportowy.
Wielkie dzieki za solidne wyjasnienia tematu.