Możesz użyć złączenia, aby utworzyć i wypełnić nową tabelę za jednym razem:
SELECT
t.*
INTO
dbo.NewTable
FROM
dbo.TableWithIdentity AS t
LEFT JOIN dbo.TableWithIdentity ON 1 = 0
;
Z powodu tego 1 = 0
warunku prawa strona nie będzie pasowała, a zatem zapobiegnie duplikacji rzędów po lewej stronie, a ponieważ jest to połączenie zewnętrzne, rzędy po lewej stronie również nie zostaną wyeliminowane. Wreszcie, ponieważ jest to sprzężenie, właściwość TOŻSAMOŚĆ została wyeliminowana.
Dlatego wybranie tylko lewej kolumny spowoduje utworzenie dokładnej kopii danych dbo.TableWithIdentity tylko w zakresie danych, tj. Z usuniętą właściwością IDENTITY.
Biorąc to wszystko pod uwagę, Max Vernon podniósł ważny punkt w komentarzu, o którym warto pamiętać. Jeśli spojrzysz na plan wykonania powyższego zapytania:
zauważysz, że tabela źródłowa jest wymieniona w planie wykonania tylko raz. Drugi przypadek został wyeliminowany przez optymalizator.
Jeśli więc optymalizator może poprawnie ustalić, że prawidłowa strona złączenia nie jest potrzebna w planie, uzasadnione jest oczekiwanie, że w przyszłej wersji programu SQL Server może być w stanie stwierdzić, że właściwość TOŻSAMOŚĆ nie musi być usunięto również, ponieważ nie ma już innej kolumny TOŻSAMOŚCI w źródłowym zestawie wierszy zgodnie z planem zapytań. Oznacza to, że powyższe zapytanie może w pewnym momencie przestać działać zgodnie z oczekiwaniami.
Ale, jak słusznie zauważył ypercubeᵀᴹ , do tej pory instrukcja wyraźnie stwierdzała, że jeśli istnieje sprzężenie, właściwość TOŻSAMOŚĆ nie jest zachowywana:
Gdy istniejąca kolumna tożsamości zostanie wybrana do nowej tabeli, nowa kolumna odziedziczy właściwość TOŻSAMOŚĆ, chyba że [...] [t] on instrukcja SELECT zawiera sprzężenie.
Tak więc, o ile instrukcja ciągle o tym wspomina, możemy być pewni, że zachowanie pozostanie takie samo.
Uznanie dla Shaneis i ypercubeᵀᴹ za wychowywanie pokrewnego tematu na czacie.
JOIN (SELECT 1) AS dummy ON 1 = 1
zadziała?