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?


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

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


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 & ""

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.