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
Поскольку вы уже приняли ответ, я хотел предложить лишь примечание: «Выбрать в» не «для временных таблиц», а для создания новой таблицы на основе структуры (и данных) выбранной части запроса. , Для таблицы X вы можете выбрать Только один раз максимум 1 раз *, после чего вам нужно использовать Вставить в, чтобы добавить любые данные. * Если таблица уже существует, то ноль раз. Это, конечно, если вы сначала не уроните стол.
pinkfloydx33

8
но учтите, что Select Into не копирует ограничения индекса / первичного ключа / внешнего ключа, поэтому оставляет вам неиндексированные данные кучи. Это полезно для быстрой разработки, но не для добавления / перемещения реальной рабочей таблицы.
Грэм Гриффитс

просто запустите это утверждение 'drop table tabletwo;' и запустить над запросом. Выберите ... в не для временных таблиц.
Шивангини

Ответы:


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 ... работает только при наличии существующей таблицы. Если таблицы не существует, используйте формат оригинального плаката (который создаст новую таблицу)
Will

6
@ Будешь ли ты иметь в виду противоположное тому, что сказал? «SELECT ... INTO ...» требует указания несуществующей таблицы, в то время как «INSERT INTO ...» требует указания существующей таблицы.
Андре С. Андерсен

5
Я хотел бы, чтобы был счетчик для количества раз, я проверяю и использую этот ответ!
MTAdmin

13

Существует два разных способа реализации вставки данных из одной таблицы в другую.

Для существующей таблицы - INSERT INTO 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


2
PS Протестировано на SYBASE ASE 15.5
Verena_Techie

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.