SQL Server SELECT в існуючу таблицю


384

Я намагаюся вибрати деякі поля з однієї таблиці та вставити їх у існуючу таблицю із збереженої процедури. Ось що я намагаюся:

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

Я думаю, що SELECT ... INTO ...це стосується тимчасових таблиць, саме тому я отримую помилку, яка dbo.TableTwoвже існує.

Як я можу вставити кілька рядків dbo.TableOneзсередини dbo.TableTwo?


29
Оскільки ви вже прийняли відповідь, я хотів запропонувати лише примітку: Select Into не "для тимчасових таблиць", це створення нової таблиці на основі структури (та даних) виділеної частини запиту. . Для таблиці X ви можете будь-коли вибирати в неї максимум 1 раз *, після чого вам потрібно використовувати Insert Into, щоб додати будь-які дані. * Якщо таблиця вже існує, то нуль разів. Це, звичайно, якщо ви не опустите таблицю спочатку.
pinkfloydx33

8
але зауважте, що Select Into не копіює обмеження в індексі / первинному ключі / зовнішньому ключі, тому він залишає вам невкладені накопичувальні дані. Це корисно для швидкої роботи розробників, але не спосіб додавання / переміщення справжньої виробничої таблиці.
Грем Гріффітс

просто запустіть цей вислів 'drop table tabletwo;' і запустіть над запитом. Виберіть ... у не для тимчасових таблиць.
Shiwangini

Відповіді:


637

SELECT ... INTO ... працює лише в тому випадку, якщо таблиця, зазначена в пункті INTO, не існує - інакше потрібно використовувати:

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

Це передбачає, що у dbo є лише два стовпці. TABLETWO - стовпці потрібно вказати інакше:

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

52
Найкраща практика завжди вказувати стовпці незалежно від того, чи всі вони там є чи ні. Це допоможе запобігти руйнуванню речей, коли хтось додає стовпець.
HLGEM

1
Гм, SELECT... INTO...здається , що оператор не працює, якщо таблиця, зазначена в INTOпункті, ще не існує. Я отримую помилку "недекларованої змінної". Хоча, можливо, це питання стосується лише MySQL. The CREATE TABLE ... LIKE .. worked;
LazerSharks

1
@Gnuey SELECT ... INTO ... працює лише за наявності існуючої таблиці. Якщо не існує таблиця, використовуйте формат оригінального автора (який буде створювати нову таблицю)
Волю

6
@Will Ви мали на увазі протилежне тому, що ви сказали? "ВИБІР ... INTO ..." потрібно вказати неіснуючу таблицю, тоді як "INSERT INTO ..." вимагає вказати існуючу таблицю.
Андре К. Андерсен

5
Мені б хотілося, щоб було кількість лічильників, скільки разів я перевіряю назад і використовую цю відповідь!
MTAdmin

13

Є два різні способи реалізації вставлення даних з однієї таблиці в іншу таблицю.

Для існуючої таблиці - ВСТУПИТИ В SELECT

Цей метод використовується, коли таблиця вже створена в базі даних раніше, і дані потрібно вставити в цю таблицю з іншої таблиці. Якщо стовпці, перелічені у пункті вставки та виберіть пункт, є однаковими, їх не потрібно перераховувати. Доброю практикою завжди є їх перелік з метою читабельності та масштабованості.

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

Для неіснуючої таблиці - SELECT INTO

Цей метод використовується, коли таблиця не створена раніше, і її потрібно створити, коли дані з однієї таблиці потрібно вставити в новостворену таблицю з іншої таблиці. Нова таблиця створена з тими ж типами даних, що і вибрані стовпці.

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

Посилання 1 2


3

Він буде працювати, як зазначено нижче:

insert into Gengl_Del Select Tdate,DocNo,Book,GlCode,OpGlcode,Amt,Narration 
from Gengl where BOOK='" & lblBook.Caption & "' AND DocNO=" & txtVno.Text & ""

5
+1, щоб протидіяти -1 і намагатися давати ідеї, які можуть використовуватись або посилатися іншими користувачами. @MarkSowul право на ін'єкцію SQL, але заради академічних цілей інші люди можуть спробувати такий метод.
Альберт Лоре

1
Більшість таблиць мають поле автоматичного збільшення, яке неможливо вставити. Так SELECT *не вийде. Це кращий спосіб, дякую!
MJH

2
@ User6675636b20796f7521 Я б не пішов так далеко, щоб припустити, що "добре", щоб інші люди спробували такий метод, якщо мова йде про інжекцію SQL. Це ніколи не слід робити, і, таким чином, ніколи не судити. Було б набагато продуктивніше редагувати цю відповідь, показуючи правильний спосіб зробити це з самого початку, і якщо хтось запитає, "що з питаннями / у символах?" ви просто відповідаєте: "це маркери параметрів для використання в параметризованих запитах (поза сферою)" і дозволяєте їм розбиратися звідти.
Метт Борха

2
select *
into existing table database..existingtable
from database..othertables....

Якщо ви вже використовували select * into tablename from other tablenamesнаступний раз для додавання, ви кажетеselect * into existing table tablename from other tablenames



10
ОП просить MS SQL.
GrandMasterFlush

1

Якщо таблиця призначення існує, але ви не хочете вказувати назви стовпців:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.