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?CROSS JOIN (SELECT 1)
,INNER JOIN (SELECT 1) ON 1=1
,LEFT JOIN (SELECT 1) ON 1=0
LubON 1=1
- żadna pozbawia tożsamości. Wygląda na to, że musi to być zadeklarowany lub utworzony obiekt .Wypróbuj ten kod ..
ISNULL
Połączenia zapewnia, że nowa kolumna jest tworzony zNOT NULL
wartości null.źródło
ISNULL()
czy+0
to robi? Czy oba są potrzebne?Aby pokazać inny sposób:
Możesz użyć połączonego serwera .
Możesz tymczasowo utworzyć serwer połączony z serwerem lokalnym, używając:
W tym momencie uruchomisz
select * into
kod, odwołując się dolocalserver
czteroelementowej nazwy połączonego serwera:Po zakończeniu wyczyść
localserver
połączony serwer w następujący sposób:Lub możesz użyć
OPENQUERY
składniźródło
Właściwość tożsamości nie jest przenoszona, jeśli instrukcja select zawiera złączenie i tak dalej
da również pożądane zachowanie (skopiowanej
id
kolumny, aby nie zachowywaćIDENTITY
właściwości. Będzie jednak miało efekt uboczny polegający na tym, że nie kopiuje żadnego wiersza! (jak w przypadku niektórych innych metod), więc będziesz musiał zrobić:(dzięki AakashM!)
źródło
Najprostszym sposobem jest uczynienie kolumny częścią wyrażenia.
Przykład:
Jeśli tabela dbo.Klient ma tożsamość w kolumnie ID, to w poniższym przykładzie tabela tymczasowa #t będzie miała również TOŻSAMOŚĆ w kolumnie ID.
Zmień to, aby zastosować wyrażenie do identyfikatora, a Ty nie będziesz już mieć TOŻSAMOŚCI w kolumnie Identyfikator. W takim przypadku stosujemy prosty dodatek do kolumny identyfikatora.
Inne przykłady wyrażeń dla innych typów danych mogą obejmować: convert (), konkatenacja ciągów lub Isnull ()
źródło
Czasami chcesz wstawić z tabeli, w której nie wiesz (lub nie obchodzi cię), czy kolumna została utworzona przy użyciu TOŻSAMOŚCI, czy nie. Może nie być nawet kolumną z liczbą całkowitą, z którą pracujesz. W takim przypadku będą działać następujące funkcje:
ISNULL usunie atrybut TOŻSAMOŚĆ z kolumny, ale wstawi go o tej samej nazwie i typie co oryginalna kolumna, a także sprawi, że nie będzie on miał wartości zerowej. TOP (0) utworzy pustą tabelę, w której możesz następnie wstawić wybrane wiersze. W razie potrzeby tabelę można również skompresować przed wstawieniem danych.
źródło
usunie tożsamość.
Minusem jest to, że
id
staje się zerowalne, ale można dodać to ograniczenie.źródło
Ty nie.
select * into
zachowuje tożsamość.źródło
*
.identity
właściwość nie zawsze jest zachowana, jak wskazywały inne odpowiedzi.