Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入到选择vs值中_Sql_Sql Server 2005_Insert - Fatal编程技术网

Sql 插入到选择vs值中

Sql 插入到选择vs值中,sql,sql-server-2005,insert,Sql,Sql Server 2005,Insert,虽然在表中插入一行时没有理由(除了美观之外)使用INSERT-INTO-SELECT,但使用此选项和INSERT-INTO-VALUES之间有什么区别吗?使用INSERT-INTO。。。选择方法允许您根据某些标准从另一个表中选择值 INSERT INTO dbo.TargetTable(Col1, Col2, ...., ColN) SELECT Col1, Col2, ..., ColN FROM dbo.SourceTable WHERE (some condition)

虽然在表中插入一行时没有理由(除了美观之外)使用
INSERT-INTO-SELECT
,但使用此选项和
INSERT-INTO-VALUES
之间有什么区别吗?

使用
INSERT-INTO。。。选择方法允许您根据某些标准从另一个表中选择值

INSERT INTO dbo.TargetTable(Col1, Col2, ...., ColN)
   SELECT Col1, Col2, ..., ColN
   FROM dbo.SourceTable
   WHERE (some condition)
这可能更容易编写,可读性更强,而不必从源表中检索20个值,将它们存储到临时变量中,这样您就可以调用
INSERT到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)

但最后——这只是一个插入数据的
INSERT
语句——这实际上只是个人偏好的问题,哪种方法更容易/更方便使用……

我不确定你在寻找什么不同之处,但我一直在用它来做验证。如果要将行插入到具有FK关系的表中,我将对引用的表使用select以确保FK存在。例如:

而不是

INSERT refTable (Tab1Key,  Tab2Key, ...)
VALUES         (@Tab1Key, @Tab2Key, ...)
我用


结果相同,只是如果键不存在,则不会插入任何行。

选择允许您首先测试是否存在

INSERT Target (...)
SELECT keyvalue1, value2
WHERE NOT EXISTS (SELECT * FROM Target WHERE keycol = keyvalue1)
或2组值

INSERT Target (...)
SELECT keyvalue1, value2
UNION ALL
SELECT keyvalue1a, value2a
否则,值的直接列表和一行没有区别

如果您的值来自另一个表,则只需插入..选择。。当然

或混合搭配:

INSERT Target (...)
SELECT col1, col2, @parameter1, @parameter2, col14
FROM Source

插入到。。。SELECT与INSERT INTO VALUES是考虑到具有大量数据的表时所观察到的性能级别的不显著差异之一:INSERT INTO。。。选择在进行插入时锁定表。因此,该表不能同时用于其他进程。

您的“DestinationTable”应该是“SourceTable”吗?
INSERT Target (...)
SELECT col1, col2, @parameter1, @parameter2, col14
FROM Source