Próbuję wykonać to zapytanie
INSERT INTO dbo.tbl_A_archive
SELECT *
FROM SERVER0031.DB.dbo.tbl_A
ale nawet po tym, jak pobiegłem
set identity_insert dbo.tbl_A_archive on
Otrzymuję ten komunikat o błędzie
Wyraźną wartość kolumny tożsamości w tabeli „dbo.tbl_A_archive” można określić tylko wtedy, gdy używana jest lista kolumn, a IDENTITY_INSERT jest WŁĄCZONY.
tbl_A
to ogromny stół w rzędach i szerokości, tzn. ma DUŻO kolumn. Nie chcę ręcznie wpisywać wszystkich kolumn. Jak mogę to uruchomić?
sql-server
jhowe
źródło
źródło
Odpowiedzi:
Podsumowanie
SQL Server nie pozwoli ci wstawić jawnej wartości w kolumnie tożsamości, chyba że użyjesz listy kolumn. Masz zatem następujące opcje:
LUB
tbl_A_archive
zwykłej kolumnie bez tożsamości : Jeśli twoja tabela jest tabelą archiwalną i zawsze podajesz wyraźną wartość dla kolumny tożsamości, dlaczego w ogóle potrzebujesz kolumny tożsamości? Zamiast tego użyj zwykłego int.Szczegóły dotyczące rozwiązania 1
Zamiast
musisz pisać
z
field1, field2, ...
zawierający nazwy wszystkich kolumn w tabelach. Jeśli chcesz automatycznie wygenerować tę listę kolumn, spójrz na odpowiedź Dave'a lub odpowiedź Andomara .Szczegóły dotyczące rozwiązania 2
Niestety nie można po prostu „zmienić typu” kolumny int tożsamości na kolumnę int nie-tożsamości. Zasadniczo masz następujące opcje:
LUB
Identity Specification
/(Is Identity)
właściwość kolumny tożsamości w tabeli archiwum naNo
. Za kulisami stworzy to skrypt do ponownego utworzenia tabeli i skopiowania istniejących danych, więc aby to zrobić, będziesz musiał również rozbroićTools
/Options
/Designers
/Table and Database Designers
/Prevent saving changes that require table re-creation
.LUB
źródło
Musisz utworzyć listę kolumn dla instrukcji INSERT:
nie tak jak „WSTAW do tabeli A WYBIERZ ........”
źródło
Jeśli korzystasz z SQL Server Management Studio, nie musisz sam wpisywać listy kolumn - wystarczy kliknąć tabelę prawym przyciskiem myszy w Eksploratorze obiektów i wybrać opcję Tabela skryptów jako -> WYBIERZ -> Okno nowego edytora zapytań .
Jeśli nie, to zapytanie podobne do tego powinno pomóc jako punkt wyjścia:
źródło
Zgadzam się z odpowiedzią Heinzi. W przypadku pierwszej drugiej opcji oto zapytanie, które generuje listę kolumn oddzieloną przecinkami:
W przypadku dużych tabel może to zaoszczędzić dużo pracy podczas pisania :)
źródło
Jeśli tabela „archiwum” ma być dokładną kopią głównej tabeli, proponuję po prostu usunąć fakt, że identyfikator jest kolumną identyczną. W ten sposób pozwoli Ci je wstawić.
Alternatywnie możesz zezwolić i zabronić wstawiania tożsamości dla tabeli za pomocą następującej instrukcji
Na koniec, jeśli potrzebujesz kolumny tożsamości, aby działała, to zawsze możesz po prostu uruchomić zapisany proc.
Spowoduje to zwrócenie wszystkich kolumn z tabeli, które można następnie wyciąć i wkleić do zapytania. (Jest to prawie ZAWSZE lepsze niż używanie *)
źródło
W przypadku instrukcji SQL należy również określić listę kolumn. Na przykład
zamiast
źródło
Oba będą działać, ale jeśli nadal występuje błąd przy użyciu # 1, przejdź do # 2
1)
2)
źródło
Aby wprowadzić wszystkie nazwy kolumn do listy rozdzielanej przecinkami dla instrukcji Select dla rozwiązań wymienionych w tym pytaniu, korzystam z następujących opcji, ponieważ są one nieco mniej szczegółowe niż większość odpowiedzi tutaj. Chociaż większość odpowiedzi tutaj jest jednak całkowicie do zaakceptowania.
1)
2) Jest to prawdopodobnie najprostsze podejście do tworzenia kolumn, jeśli masz SQL Server SSMS.
źródło
Musisz podać nazwę kolumny, którą chcesz wstawić, jeśli istnieje kolumna Tożsamość. Polecenie będzie więc wyglądać tak:
Jeśli tabela ma wiele kolumn, uzyskaj nazwę tych kolumn za pomocą tego polecenia.
(po usunięciu ostatniego przecinka (',')) Wystarczy skopiować nazwę poprzednich kolumn.
źródło
To powinno działać. Właśnie natrafiłem na twój problem:
Niestety wydaje się, że potrzebujesz listy kolumn, w tym kolumny tożsamości, aby wstawić rekordy określające tożsamość. Nie musisz jednak wymieniać kolumn w SELECT. Jak sugerował @Dave Cluderay , spowoduje to sformatowanie listy do skopiowania i wklejenia (jeśli mniej niż 200 000 znaków).
Dodałem USE, ponieważ przełączam się między instancjami.
źródło
Nie tak jak to
źródło
Ten fragment kodu pokazuje, jak wstawić do tabeli, gdy kolumna Klucz podstawowy tożsamości jest WŁĄCZONA.
źródło
Na przykład, jeśli chcesz wstawić wartości z jednej tabeli do drugiej za pomocą procedury składowanej. Użyłem tego i tego , tego drugiego, co jest prawie jak odpowiedź Andomara.
źródło
Istnieje co najmniej jedna kolumna, która ma właściwość automatycznego przyrostu lub wartość tego atrybutu zostanie obliczona jako ograniczenie. Próbujesz zmodyfikować tę kolumnę.
Istnieją dwa sposoby rozwiązania tego problemu: 1) Wymień wyraźnie inne kolumny i ustaw tylko ich wartości, a PrimaryKey lub wartość kolumny automatycznego przyrostu ustawią się automatycznie.
2) Możesz włączyć INDENTITY_INSERT, a następnie wykonać zapytanie wstawiania, a następnie wyłączyć IDENTITY_INSERT.
Sugestia: Wykonaj pierwszy krok, ponieważ jest to bardziej odpowiednie i wydajne podejście.
Aby uzyskać więcej informacji, przeczytaj ten artykuł na temat programu pomocniczego SQL .
źródło
Upewnij się, że nazwy kolumn, typy danych i kolejność w tabeli, z której wybierasz rekordy, są dokładnie takie same jak w tabeli docelowej. Jedyną różnicą powinno być to, że tabela docelowa ma kolumnę tożsamości jako pierwszą kolumnę, której nie ma w tabeli źródłowej.
Miałem podobny problem podczas wykonywania polecenia „INSERT INTO table_Dest SELECT * FROM table_source_linked_server_excel”. Tabele miały 115 kolumn.
Miałem dwie takie tabele, w których ładowałem dane z Excela (jako serwer połączony) do tabel w bazie danych. W tabelach bazy danych dodałem kolumnę tożsamości o nazwie „id”, której nie było w źródłowym programie Excel. W przypadku jednej tabeli zapytanie zakończyło się powodzeniem, aw innej wystąpił błąd „Wyraźną wartość kolumny tożsamości w tabeli można określić tylko wtedy, gdy używana jest lista kolumn, a IDENTITY_INSERT znajduje się na serwerze SQL”. To było zagadkowe, ponieważ scenariusz był dokładnie taki sam dla obu zapytań. Sprawdziłem to i znalazłem to w zapytaniu, w którym pojawiał się błąd z INSERT INTO .. WYBIERZ *:
Po wprowadzeniu powyższych dwóch zmian zapytanie INSERT INTO ... SELECT * zostało uruchomione pomyślnie. Kolumna tożsamości w tabeli docelowej wygenerowała wartości tożsamości dla każdego wstawionego wiersza zgodnie z oczekiwaniami.
Tak więc, mimo że tabela docelowa może mieć kolumnę tożsamości, której nie ma w tabeli źródłowej, INSERT INTO .. SELECT * uruchomi się pomyślnie, jeśli nazwy, typy danych i kolejność kolumn w źródle i miejscu docelowym są dokładnie takie same.
Mam nadzieję, że to komuś pomoże.
źródło
Myślę, że ten błąd występuje z powodu niedopasowania liczby kolumn w definicji tabeli i liczby kolumn w zapytaniu wstawiania. Długość kolumny jest również pomijana z wprowadzoną wartością. Wystarczy przejrzeć definicję tabeli, aby rozwiązać ten problem
źródło