WYBIERZ SQL Server do istniejącej tabeli

384

Próbuję wybrać niektóre pola z jednej tabeli i wstawić je do istniejącej tabeli z procedury składowanej. Oto, co próbuję:

SELECT col1, col2
INTO dbo.TableTwo 
FROM dbo.TableOne 
WHERE col3 LIKE @search_key

Myślę, że SELECT ... INTO ...dotyczy tabel tymczasowych i dlatego pojawia się błąd, który dbo.TableTwojuż istnieje.

Jak mogę wstawić wiele wierszy dbo.TableOnedo dbo.TableTwo?

Daniel
źródło
29
Ponieważ już zaakceptowałeś odpowiedź, chciałem przedstawić tylko notatkę: Select Into nie jest „dla tabel tymczasowych”, służy do tworzenia nowej tabeli na podstawie struktury (i danych) wybranej części zapytania . W przypadku tabeli X możesz wybrać opcję Wybierz tylko 1 raz *, po czym musisz użyć polecenia Wstaw, aby dołączyć dowolne dane. * Jeśli tabela już istnieje, zero razy. Jest to oczywiście możliwe, chyba że najpierw opuścisz stół.
pinkfloydx33
8
ale zwróć uwagę, że Select Into nie kopiuje ograniczeń indeksu / klucza podstawowego / klucza obcego, więc pozostawia ci niezindeksowane heap-o-data. Jest to przydatne do szybkiej pracy deweloperów, ale nie jest sposobem dodawania / przenoszenia prawdziwej tabeli produkcyjnej.
Graham Griffiths,
po prostu uruchom instrukcję „drop table tabletwo;” i uruchom powyżej zapytania. Wybierz ... w nie jest dla tabel tymczasowych.
Shiwangini,

Odpowiedzi:

637

SELECT ... INTO ... działa tylko wtedy, gdy tabela określona w klauzuli INTO nie istnieje - w przeciwnym razie musisz użyć:

INSERT INTO dbo.TABLETWO
SELECT col1, col2
  FROM dbo.TABLEONE
 WHERE col3 LIKE @search_key

Zakłada się, że w dbo są tylko dwie kolumny. TABLETWO - w przeciwnym razie musisz określić kolumny:

INSERT INTO dbo.TABLETWO
  (col1, col2)
SELECT col1, col2
  FROM dbo.TABLEONE
 WHERE col3 LIKE @search_key
Kucyki OMG
źródło
52
Najlepszym rozwiązaniem jest, aby zawsze określać kolumny bez względu na to, czy są one wszystkie, czy nie. Pomoże to zapobiec uszkodzeniu rzeczy, gdy ktoś doda kolumnę.
HLGEM
1
Hmm, SELECT... INTO...instrukcja wydaje się nie działać, jeśli tabela określona w INTOklauzuli jeszcze nie istnieje. Pojawia się błąd „niezadeklarowanej zmiennej”. Chociaż może ten problem dotyczy tylko MySQL. CREATE TABLE ... LIKE .. worked;
LazerSharks,
1
@Gnuey SELECT ... INTO ... działa tylko wtedy, gdy istnieje istniejąca tabela. Jeśli nie ma istniejącej tabeli, użyj oryginalnego formatu plakatu (który utworzy nową tabelę)
Będzie
6
@Will Czy chodziło Ci o przeciwieństwo tego, co powiedziałeś? „WYBIERZ ... DO…” wymaga podania nieistniejącej tabeli, podczas gdy „WEWNĘTRZ ...” wymaga podania istniejącej tabeli.
André C. Andersen
5
Szkoda, że ​​nie było licznika, ile razy sprawdzam i używam tej odpowiedzi!
MTAdmin,
13

Istnieją dwa różne sposoby implementacji wstawiania danych z jednej tabeli do drugiej.

Dla istniejącej tabeli - WPROWADŹ DO WYBORU

Ta metoda jest stosowana, gdy tabela jest już wcześniej utworzona w bazie danych, a dane mają zostać wstawione do tej tabeli z innej tabeli. Jeśli kolumny wymienione w klauzuli insert i select są takie same, nie trzeba ich wymieniać. Dobrą praktyką jest zawsze umieszczanie ich na liście w celu zapewnienia czytelności i skalowalności.

----Create testable
CREATE TABLE TestTable (FirstName VARCHAR(100), LastName VARCHAR(100))
----INSERT INTO TestTable using SELECT
INSERT INTO TestTable (FirstName, LastName)
SELECT FirstName, LastName
FROM Person.Contact
WHERE EmailPromotion = 2
----Verify that Data in TestTable
SELECT FirstName, LastName
FROM TestTable
----Clean Up Database
DROP TABLE TestTable

Dla tabeli nieistniejącej - WYBIERZ

Ta metoda jest używana, gdy tabela nie jest tworzona wcześniej i musi zostać utworzona, gdy dane z jednej tabeli mają zostać wstawione do nowo utworzonej tabeli z innej tabeli. Nowa tabela jest tworzona z tymi samymi typami danych, co wybrane kolumny.

----Create a new table and insert into table using SELECT INSERT
SELECT FirstName, LastName
INTO TestTable
FROM Person.Contact
WHERE EmailPromotion = 2
----Verify that Data in TestTable
SELECT FirstName, LastName
FROM TestTable
----Clean Up Database
DROP TABLE TestTable

Ref 1 2

Somnath Muluk
źródło
3

To działałoby, jak podano poniżej:

insert into Gengl_Del Select Tdate,DocNo,Book,GlCode,OpGlcode,Amt,Narration 
from Gengl where BOOK='" & lblBook.Caption & "' AND DocNO=" & txtVno.Text & ""
Vinod Pareek
źródło
5
+1, aby przeciwdziałać -1 i za wysiłek dostarczający pomysłów, które mogą być wykorzystane lub do których mogą się odnosić inni użytkownicy. @ MarkSowul ma prawo do wstrzykiwania SQL, ale ze względów akademickich inni ludzie mogą wypróbować tego rodzaju metodę.
Albert Laure,
1
Większość tabel ma pole automatycznego przyrostu, którego nie można wstawić. Więc SELECT *nie zadziała. To lepszy sposób, dzięki!
MJH
2
@ User6675636b20796f7521 Nie posunąłbym się tak daleko, aby zasugerować, że inne osoby mogą wypróbować tego rodzaju metodę, jeśli mówimy o iniekcji SQL. Nigdy nie należy tego robić, a zatem nigdy nie należy próbować. O wiele bardziej produktywne byłoby edytowanie tej odpowiedzi pokazującej prawidłowy sposób zrobienia tego od samego początku, a jeśli ktoś zapyta: „co ze znakami zapytania / symbolami?” po prostu odpowiadasz: „są to znaczniki parametrów do użycia w sparametryzowanych zapytaniach (poza zakresem)” i pozwól im to zrozumieć.
Matt Borja
2
select *
into existing table database..existingtable
from database..othertables....

Jeśli używałeś select * into tablename from other tablenamesjuż, następnym razem, aby dołączyć, mówiszselect * into existing table tablename from other tablenames

Verena_Techie
źródło
2
PS Testowane na SYBASE ASE 15.5
Verena_Techie 24.04.2013
10
OP prosi o MS SQL.
GrandMasterFlush 24.04.13
1

Jeśli tabela docelowa istnieje, ale nie chcesz określać nazw kolumn:

DECLARE @COLUMN_LIST NVARCHAR(MAX);
DECLARE @SQL_INSERT NVARCHAR(MAX);

SET @COLUMN_LIST = (SELECT DISTINCT
    SUBSTRING(
        (
            SELECT ', table1.' + SYSCOL1.name  AS [text()]
            FROM sys.columns SYSCOL1
            WHERE SYSCOL1.object_id = SYSCOL2.object_id and SYSCOL1.is_identity <> 1
            ORDER BY SYSCOL1.object_id
            FOR XML PATH ('')
        ), 2, 1000)
FROM
    sys.columns SYSCOL2
WHERE
    SYSCOL2.object_id = object_id('dbo.TableOne') )

SET @SQL_INSERT =  'INSERT INTO dbo.TableTwo SELECT ' + @COLUMN_LIST + ' FROM dbo.TableOne table1 WHERE col3 LIKE ' + @search_key
EXEC sp_executesql @SQL_INSERT
slayernoah
źródło