SQL Server SELECT进入现有表

Dan*_*iel 373 sql t-sql sql-server stored-procedures

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

SELECT col1, col2
INTO dbo.TableTwo 
FROM dbo.TableOne 
WHERE col3 LIKE @search_key
Run Code Online (Sandbox Code Playgroud)

我认为select into是临时表,这就是为什么我得到一个SELECT ... INTO ...已经存在的错误.

我怎样才能插入多行dbo.TableTwodbo.TableOne

OMG*_*ies 619

SELECT ... INTO ... 只有在INTO子句中指定的表不存在时才有效 - 否则,您必须使用:

INSERT INTO dbo.TABLETWO
SELECT col1, col2
  FROM dbo.TABLEONE
 WHERE col3 LIKE @search_key
Run Code Online (Sandbox Code Playgroud)

假设dbo.TABLETWO中只有两列 - 否则需要指定列:

INSERT INTO dbo.TABLETWO
  (col1, col2)
SELECT col1, col2
  FROM dbo.TABLEONE
 WHERE col3 LIKE @search_key
Run Code Online (Sandbox Code Playgroud)

  • 最佳做法是始终指定列,无论它们是否全部存在.当有人添加列时,它将有助于防止事情破裂. (49认同)
  • @Will你的意思与你说的相反吗?'SELECT ... INTO ...'需要指定一个不存在的表,而'INSERT INTO ...'需要指定一个现有的表. (6认同)
  • 我希望有一个计数器可以查询我使用该答案的次数! (5认同)
  • 嗯,如果在`INTO` 子句中指定的表不存在,`SELECT... INTO...` 语句似乎不起作用。我收到“未声明的变量”错误。虽然这个问题可能只针对 MySQL。`CREATE TABLE ... LIKE .. 工作`; (2认同)

Som*_*luk 12

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

对于现有表 - 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
Run Code Online (Sandbox Code Playgroud)

对于非现有表 - 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
Run Code Online (Sandbox Code Playgroud)

参考1 2


小智 5

它将按如下方式工作:

insert into Gengl_Del Select Tdate,DocNo,Book,GlCode,OpGlcode,Amt,Narration 
from Gengl where BOOK='" & lblBook.Caption & "' AND DocNO=" & txtVno.Text & ""
Run Code Online (Sandbox Code Playgroud)

  • +1 来抵消 -1 并努力提供可供其他用户使用或参考的想法。@MarkSowul 的 SQL 注入是正确的,但出于学术目的,其他人可以尝试这种方法。 (6认同)
  • @User6675636b20796f7521 如果这是我们正在讨论的 SQL 注入,我不会建议其他人尝试这种方法“可以”。永远不应该这样做,因此永远不要尝试。编辑这个答案会更有成效,从一开始就显示“正确”的方法来做到这一点,如果有人问,“问号/符号是什么?” 您只需回复“这些是用于参数化查询(超出范围)的参数标记”,然后让他们从那里找出答案。 (2认同)