【问题标题】:SQL Server : is there a way to insert into a table values using both SELECT and VALUES at the same time?SQL Server:有没有办法同时使用 SELECT 和 VALUES 插入表值?
【发布时间】:2014-01-15 09:51:41
【问题描述】:

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

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

如您所见,我正在尝试从表中获取ID 和Name 的前两个值,而对于email,我想指定一个值。

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

【问题讨论】:

  • 您也可以使用SELECT 指定值和表达式,VALUES(..) 只是SELECT 的严格限制版本。

标签: sql sql-server select insert


【解决方案1】:

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 

【讨论】:

  • 我不知道在 SELECT 之后输入引号会插入引用的值。你的最后一个例子澄清了一切
  • @Vantalk:您可以指定表/视图中的列,或 SQL 变量 (@emailAddress),或 literals(这是什么 - 字符串文字 -也适用于SELECT 语句中的0 或42 等数字文字
【解决方案2】:

类似的,

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

【讨论】:

    【解决方案3】:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2021-03-02
      • 2019-08-30
      相关资源
      最近更新 更多