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
插入数据的声明 - 它实际上只是个人偏好的问题,哪种方法更容易/更方便使用....
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)
我不确定你在寻找什么差异,但我一直用这个来做验证.如果我在具有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)
结果是相同的,但如果键不存在则不插入行.