SQL Server:有没有办法同时使用SELECT和VALUES插入表值?

时间:2013-12-27 19:47:41

标签: sql sql-server select insert

我正在尝试设置一个触发器,它将从表中插入某些值,并使用VALUES命令指定其他值。类似下面的代码:

INSERT INTO table_name(ID, Name, Email) 
    SELECT userID, userName 
    FROM users_table 
    WHERE condition1 
VALUES ('example@yahoo.com')

正如您所看到的,我正在尝试从表格中获取IDName的前2个值,而email我想要指定一个值。

如果相关,我在crt中有一个自动增量列(称为table_name)。那我怎么能这样做呢?

3 个答案:

答案 0 :(得分:5)

INSERT命令有两种形式:

(1)您可以使用所有值,如文字或SQL Server变量 - 在这种情况下,您可以使用INSERT .. VALUES()方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN)

注意:我建议始终明确指定要插入数据的列列表 - 这样,如果您的表突然有一个额外的列,或者如果突然您的表有额外的列,您将不会有任何令人讨厌的意外您的表具有IDENTITY或计算列。是的 - 这是一个更多的工作 - 一次 - 但是你的INSERT陈述尽可能坚实,如果你的桌子你不必经常摆弄它变化。

(2)如果您将所有值都作为文字和/或变量,而是您想要依赖另一个表,多个表或视图,提供值,然后您可以使用INSERT ... SELECT ...方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
   SELECT
       SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN
   FROM
       dbo.YourProvidingTableOrView

在这里,您必须在SELECT中定义与INSERT所期望的完全相同的项目 - 这些项目可以是表格(或视图)中的列,或者那些可以是文字或变量。再次:明确提供要插入的列的列表 - 参见上文。

你可以使用中的一个 - 但是你不能混合两者 - 你不能使用SELECT并且有一个VALUES(...)子句在它的中间 - 选择其中一个 - 坚持下去。

所以在你的具体案例中,只需使用:

INSERT INTO dbo.table_name (ID, Name, Email) 
  SELECT userID, userName, 'example@yahoo.com'
  FROM users_table 
  WHERE condition1 

答案 1 :(得分:3)

这样的事,

INSERT INTO table_name (ID, Name, Email) 
SELECT userID, userName, 'example@yahoo.com' AS Email
FROM   users_table 
WHERE  ..condition1..

答案 2 :(得分:0)

1)

INSERT INTO dbo.TargetTable(...)
SELECT Col1, Col2, ... FROM ... WHERE ...
UNION ALL
SELECT 'Constant1' AS Col1, 2 AS Col2, '2013-12-27T00:00:00' AS Col3
UNION ALL
SELECT 'Constant2' AS Col1, 3 AS Col2, '2013-12-28T00:00:00' AS Col3

2)

DECLARE @AllRows TABLE(Col1 VARCHAR(50), Col2 INT, Col3 DATETIME);
INSERT INTO @AllRows (...)
SELECT Col1, Col2, ... FROM ... WHERE ...

INSERT INTO @AllRows (...)
VALUES ('Constant1', 2, '2013-12-27T00:00:00');

INSERT INTO @AllRows (...)
VALUES ('Constant2', 3, '2013-12-28T00:00:00');

INSERT INTO dbo.TargetTable(...)
SELECT Col1, Col2, Col3 FROM @AllRows;