ChatGPT解决这个技术问题 Extra ChatGPT

SQL Server SELECT 到现有表

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

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 不适用于临时表。

O
OMG Ponies

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... 语句似乎不起作用。我收到“未声明的变量”错误。虽然也许这个问题只适用于 MySQL。 CREATE TABLE ... LIKE .. worked;
@Gnuey SELECT ... INTO ... 仅在存在现有表时才有效。如果没有现有表格,请使用原始海报的格式(这将创建一个新表格)
@Will 你的意思与你所说的相反吗? 'SELECT ... INTO ...' 需要指定一个不存在的表,而 'INSERT INTO ...' 需要指定一个现有的表。
我希望有一个计数器来记录我查看并使用此答案的次数!
S
Somnath Muluk

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

对于现有表 - 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

参考 1 2


V
Vinod Pareek

它将按以下方式工作:

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符号是什么?”您只需回答,“这些是用于参数化查询(超出范围)的参数标记”,然后让他们从那里弄清楚。
s
slayernoah

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

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

S
Shadow The Kid Wizard
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。
请删除,这是令人困惑/噪音,因为这不是 SQL Server
I
I_love_vegetables

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

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

J
John Claude

如果要从 Table_B 中插入 Table_A,仅当该列不在 Table_A 中时,请使用以下命令:

BEGIN TRANSACTION

INSERT INTO dbo.Table_A (Column_1)
SELECT DISTINCT Some_Column AS Column_1
FROM dbo.Table_B 
WHERE Some_Column 
    NOT IN (SELECT DISTINCT GroupId 
            FROM dbo.Table_A)

COMMIT