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
Dzieki za te informacje. były kluczowe
Dobrze wyjaśnione, dzięki !
a z innej strony - co gdybym ciąg znaków chciał mieć rozbity nie na wiersze a na kolumny? Czyli ciąg ABCD: 1. kolumna: A, 2. kolumna: B, 3. kolumna: C, 4 kolumna: D?
Ciekawy artykuł.
Czy można za pomocą EF wysłać swoje zapytanie?
Czy lepiej do tego użyć ADO.net i DataTable?