插入SELECT与VALUES

Use*_*ser 14 sql sql-server-2005 insert

虽然在表格中INSERT INTO SELECT插入单行时没有理由(除了美学),但是使用它和INSERT INTO VALUES?之间有什么区别吗?

mar*_*c_s 12

使用该INSERT INTO ... SELECT方法,您可以根据某些条件从另一个表中选择值.

INSERT INTO dbo.TargetTable(Col1, Col2, ...., ColN)
   SELECT Col1, Col2, ..., ColN
   FROM dbo.SourceTable
   WHERE (some condition)
Run Code Online (Sandbox Code Playgroud)

这可能会更简单,更易读,而不必从源表中检索20个值,将它们存储到临时变量中,这样您就可以调用INSERT INTO dbo.Destination(....) VALUES(......)语句了...

DECLARE @Value1 INT
DECLARE @Value2 DATETIME
....
DECLARE @ValueN INT

SELECT 
      @Value1 = Col1,
      @Value2 = Col2,
      ....
      @ValueN = ColN
FROM 
    dbo.SourceTable
WHERE
     (some condition) 

INSERT INTO dbo.TargetTable(Col1, Col2, ...., ColN)
VALUES(@Value1, @Value2, ....., @ValueN)
Run Code Online (Sandbox Code Playgroud)

但最终 - 它只是一个INSERT 插入数据的声明 - 它实际上只是个人偏好的问题,哪种方法更容易/更方便使用....


gbn*_*gbn 7

SELECT允许您首先测试存在

INSERT Target (...)
SELECT keyvalue1, value2
WHERE NOT EXISTS (SELECT * FROM Target WHERE keycol = keyvalue1)
Run Code Online (Sandbox Code Playgroud)

或2组值

INSERT Target (...)
SELECT keyvalue1, value2
UNION ALL
SELECT keyvalue1a, value2a
Run Code Online (Sandbox Code Playgroud)

否则,直接的值列表和一行没有区别

如果你的值来自另一个表,那么只需要INSERT..SELECT ..当然

或者mix'n'match:

INSERT Target (...)
SELECT col1, col2, @parameter1, @parameter2, col14
FROM Source
Run Code Online (Sandbox Code Playgroud)


n8w*_*wrl 5

我不确定你在寻找什么差异,但我一直用这个来做验证.如果我在具有FK关系的表中插入一行,我将在引用的表上使用select以确保FK存在.例:

代替

INSERT refTable (Tab1Key,  Tab2Key, ...)
VALUES         (@Tab1Key, @Tab2Key, ...)
Run Code Online (Sandbox Code Playgroud)

我用

INSERT refTable (Tab1Key,  Tab2Key, ...)
SELECT          Tab1.Key, Tab2.Key, ...
  FROM Table1 Tab1, Table2 Tab2
 WHERE Tab1.Key = @Tab1Key
   AND Tab2.Key = @Tab2Key
Run Code Online (Sandbox Code Playgroud)

结果是相同的,但如果键不存在则不插入行.