SQL Server SELECT 到现有表

Posted

技术标签:

【中文标题】SQL Server SELECT 到现有表【英文标题】:SQL Server SELECT into existing table 【发布时间】:2011-05-05 08:14:37 【问题描述】:

我正在尝试从一个表中选择一些字段并将它们插入到存储过程中的现有表中。这是我正在尝试的:

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

我认为SELECT ... INTO ... 用于临时表,这就是为什么我收到dbo.TableTwo 已经存在的错误。

如何将dbo.TableOne 中的多行插入dbo.TableTwo

【问题讨论】:

既然您已经接受了答案,我只想提供一个说明:Select Into 不是“用于临时表”,而是用于根据结构(和数据) 查询的选择部分。对于表 X,您最多只能选择 1 次*,之后您需要使用 Insert Into 来追加任何数据。 *如果表已经存在,则为零次。当然,除非您先 DROP 表。 但请注意 Select Into 不会复制索引/主键/外键约束,因此它会为您留下未索引的堆数据。它对快速开发工作很有用,但不是添加/移动真实生产表的方式。 只要运行这个语句'drop table tabletwo;'并运行上面的查询。 Select ...into 不适用于临时表。 【参考方案1】:

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

【讨论】:

最好的做法是始终指定列,无论它们是否都存在。这将有助于防止有人添加列时出现问题。 嗯,如果INTO 子句中指定的表不存在,SELECT... INTO... 语句似乎不起作用。我收到“未声明的变量”错误。虽然也许这个问题只适用于 mysqlCREATE TABLE ... LIKE .. worked; @Gnuey SELECT ... INTO ... 仅在存在现有表时才有效。如果没有现有表格,请使用原始海报的格式(这将创建一个新表格) @Will 你的意思和你说的相反吗? 'SELECT ... INTO ...' 需要指定一个不存在的表,而 'INSERT INTO ...' 需要指定一个现有的表。 我希望有一个计数器来记录我查看并使用此答案的次数!【参考方案2】:

有两种不同的方法可以实现将数据从一个表插入到另一个表。

对于现有表 - INSERT INTO SELECT

当表已经在数据库中创建并且要从另一个表中插入数据到该表中时,使用此方法。如果 insert 子句和 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

参考12

【讨论】:

【参考方案3】:

如下所示:

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

【讨论】:

+1 来抵消 -1 并努力提供可以被其他用户使用或引用的想法。 @MarkSowul 是 SQL 注入的权利,但出于学术目的,其他人可以尝试这种方法。 大部分表格都有自增字段,不能插入。所以SELECT * 不起作用。这是一个更好的方法,谢谢! @User6675636b20796f7521 如果是我们正在谈论的 SQL 注入,我不会建议其他人尝试这种方法“没问题”。永远不应该这样做,因此永远不要尝试。编辑这个答案会更有效率,从一开始就显示 正确 方法,如果有人问,“问号/at 符号是什么?”您只需回答,“那些是用于参数化查询(超出范围)的参数标记”,然后让他们从那里弄清楚。【参考方案4】:
select *
into existing table database..existingtable
from database..othertables....

如果你已经用过select * into tablename from other tablenames,下次追加,你说select * into existing table tablename from other tablenames

【讨论】:

PS 在 SYBASE ASE 15.5 上测试 OP 正在请求 MS SQL。【参考方案5】:

如果目标表确实存在但您不想指定列名:

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

【讨论】:

【参考方案6】:

如果您想在使用 select into 创建的新表中创建一个标识列,则可以按如下方式完成。

SELECT 
 ID = IDENTITY(INT, 1, 1),
        name
INTO    table2
FROM table1    

【讨论】:

以上是关于SQL Server SELECT 到现有表的主要内容,如果未能解决你的问题,请参考以下文章

将列添加到现有 SQL Server 表 - 含义

SQL Server 将自动增量主键添加到现有表

将具有默认值的列添加到 SQL Server 中的现有表

SQL Server 将现有表复制到新表中但跳过重复记录

如何将 R 数据框插入到 SQL Server 中的现有表中

如何使用 SSMA(用于访问 SQL Server)将具有不同列的表迁移到现有表中?