2008-09-23 6 views
11

mam tabeli temp z dokładną strukturą betonowej stołu T. został stworzony następująco: wybrać górną 0 * w #tmp z TWłóż do ... Wybierz *, jak ignorować tożsamość?

Po obróbce i napełniania zawartości w #tmp, że chce skopiuj zawartość do T w ten sposób: wstaw do T wybierz * z #tmp

To jest w porządku, o ile T nie ma kolumny tożsamości, ale w moim przypadku tak. Czy mimo to mogę zignorować kolumnę tożsamości z autotestu z #tmp po skopiowaniu do T? Moją motywacją jest unikanie konieczności przeliterowywania każdej nazwy kolumny na liście Wstaw do listy.

EDIT: przełączanie IDENTITY_INSERT nie będzie działać, ponieważ pkeys w #tmp może kolidować z tymi w T jeśli wiersze zostały wprowadzone do T poza moim skrypcie, to jeśli #tmp ma auto-zwiększany o Pkeya synchronizacji z wt za pierwsze miejsce.

+0

może Pan wyjaśnić nieco więcej o tym, dlaczego chcesz kopię tabeli temp w pierwszej kolejności proszę? Może istnieć lepszy sposób na osiągnięcie tego, czego szukasz. –

+0

1. daje mi to możliwość podglądu danych przed wykonaniem wstawki 2. Mam połączenia między tabelami tymczasowymi jako częścią moich obliczeń; tabele tymczasowe pozwalają mi skupić się na dokładnych ustawionych danych, z którymi pracuję. Myślę, że to było to. Wszelkie sugestie/komentarze? – Haoest

+0

Czy Twoim celem jest po prostu podwojenie danych, które już tam są? A może czyścisz T przed wstawieniem? –

Odpowiedz

8

Jako tożsamość być generowane podczas wstawiania, czy możesz po prostu usunąć tę kolumnę z #tmp przed wstawieniem danych z powrotem do T?

alter table #tmp drop column id 

UPD: Oto przykład Przetestowałem w SQL Server 2008:

create table T(ID int identity(1,1) not null, Value nvarchar(50)) 
insert into T (Value) values (N'Hello T!') 
select top 0 * into #tmp from T 
alter table #tmp drop column ID 
insert into #tmp (Value) values (N'Hello #tmp') 
insert into T select * from #tmp 
drop table #tmp 
select * from T 
drop table T 
+0

Z moich prostych eksperymentów wygląda na to, że to robi pracę :) dzięki. Czy ktokolwiek może wymyślić jakiś sposób, w którym zawartość komórki może być źle wyrównana ze względu na fakt, że tablica źródłowa # tmp ma o 1 kolumnę mniej niż docelowy T? – Haoest

+0

Cześć, próbowałem tego, ale wstawienie z powrotem do oryginalnej tabeli nie działa, mówi "Nazwa kolumny lub liczba podanych wartości nie pasuje do definicji tabeli.". tj. to polecenie "wstaw do T select * z #tmp" nie działa. – kristianp

+0

@kristianp Dodałem do odpowiedzi pełny działający kod testowy, ale możliwe, że próbujesz rozwiązać nieco inny problem, np.możesz mieć już wstawioną tożsamość. Jeśli inne odpowiedzi na to pytanie i wyszukiwanie SO nie pomogą, może warto utworzyć nowe pytanie z większą ilością szczegółów na temat twojej sytuacji. –

13

SET IDENTITY_INSERT NA

polecenia INSERT

SET IDENTITY_INSERT OFF

+0

Może to być kolizja klucza podstawowego, jeśli to zrobię, ponieważ przed upływem czasu #tmp jest gotowy do kopiowania, te same klucze mogły zostać wstawione do T. – Haoest

+0

Pakowałoby to jako pracę transakcyjną? – Kolten

+0

Ahh, to by działało. Nie rozpocząłem transakcji, dopóki # tmp nie jest gotowe do kopiowania (mam dużo tmps do obliczenia), aby zminimalizować czas blokady. Chyba teraz jest to uzasadnione. – Haoest

1

Nie z SELECT * - jeśli wybrałeś każdą kolumnę, ale tożsamość, wszystko będzie dobrze. Jedyny sposób, jaki widzę, to to, że można to zrobić, dynamicznie budując instrukcję INSERT.

1

Po prostu wpisz kolumny, które chcesz ponownie wstawić, nigdy nie powinieneś używać select * anyway. Jeśli nie chcesz ich wpisywać, po prostu przeciągnij je z przeglądarki obiektów (Jeśli rozwiniesz tabelę i przeciągniesz słowo, kolumny, otrzymasz je wszystkie, po prostu usuń kolumnę identyfikatora)

+0

błąd projektu lub coś takiego, ta tabela ma około 80 kolumn, z czego 30 jest przestarzałych. Ze względu na sposób #tmp jest, myślę, że jest w porządku, aby zrobić wyjątek za pomocą select *. – Haoest

0

mogą być skutki "update gdzie T.ID = # tmp.ID" praca?

+0

nie, nie ma treści w #tmp – Haoest

-1
  1. daje mi szansę na podgląd danych przed zrobić wkładkę
  2. mam Połączenia tabel tymczasowych w ramach moich obliczeń; tabele tymczasowe pozwalają mi skupić się na dokładnych ustawionych danych, z którymi pracuję. Myślę, że to było to. Wszelkie sugestie/komentarze?

Dla części 1, jak wspomniano przez Kolten w jednym z komentarzy, enkapsulacji swoje wypowiedzi w transakcji i dodając parametr, aby przełączać między wyświetlaczem i zobowiązać swoich potrzeb. W przypadku części 2 powinienem zobaczyć, jakie "obliczenia" próbujesz. Ograniczenie danych do tabeli tymczasowej może nadmiernie komplikować sytuację.

0

INSERT INTO #table SELECT MAX (id) + ROW_NUMBER() OVER (ORDER BY ID)

2

zobaczyć odpowiedzi here i here:

select * into without_id from with_id 
union all 
select * from with_id where 1 = 0 

Powód:

Kiedy istniejąca kolumna tożsamości jest wybierana do nowej tabeli, nowa kolumna dziedziczy własność IDENTITY, chyba że spełniony jest jeden z następujących warunków:

  • Instrukcja SELECT zawiera łączenie, klauzulę GROUP BY lub funkcję agregującą.
  • Wiele instrukcji SELECT jest łączonych za pomocą UNION.
  • Kolumna tożsamości jest wyświetlana więcej niż jeden raz na liście wyboru.
  • Kolumna tożsamości jest częścią wyrażenia.
  • Kolumna tożsamości pochodzi ze zdalnego źródła danych.

Jeśli którykolwiek z tych warunków jest spełniony, kolumna zostanie utworzona NOT NULL zamiast dziedziczyć właściwość IDENTITY. Jeśli kolumna tożsamości jest wymagana w nowej tabeli, ale taka kolumna nie jest dostępna lub jeśli chcesz uzyskać wartość początkową lub przyrostową, która jest inna niż kolumna tożsamości źródła, zdefiniuj kolumnę na liście wyboru przy użyciu funkcji TOŻSAMOŚCI. Zobacz "Tworzenie kolumny tożsamości za pomocą funkcji TOŻSAMOŚĆ" w sekcji Przykłady poniżej.

Wszystko zasługa Eric Humphrey i bernd_k

+0

To jest genialne. Dokładnie to, o co poprosił oryginalny plakat. – Juraj