【问题标题】:Multiple row insert into two tables avoiding loops多行插入两个表避免循环
【发布时间】:2017-03-29 20:09:25
【问题描述】:

我有一组值必须插入到两个表中。输入有 5 行,我必须先将这 5 行插入表 A。表 A 有一个标识列。接下来我必须插入这 5 个行到表 B 中,并带有一个额外的列,该列是表 A 中的标识。 在不使用任何循环的情况下如何做到这一点? 任何帮助都会非常有帮助。

INSERT INTO TABLE_A(COL2,COL3)
SELECT COL2,COL3 FROM #TEMP_TAB

set @identityval=@@identity 
INSERT INTO TABLE_B(COLA,COLB,COLC)
 SELECT @identityval,COL2,COL3,COL4 FROM #TEMP_TAB

【问题讨论】:

  • 您能向我们展示一下您目前提出的 SQL 吗?

标签: sql sybase


【解决方案1】:

您不能使用单个语句插入到多个表中。

您可以做的是在表 A 上创建一个插入触发器,以便在插入发生后执行新插入,并使用插入到表 A 中的值的标识并将其插入到表 B 中。

【讨论】:

  • 我不想一次性插入。我也不能使用触发器,因为这不会在任何时候发生。这是一种特殊情况。
【解决方案2】:

这是一种解决方案。

从表 TABLE_A 中获取最大标识列
在表 TABLE_A 中插入新记录
然后从 TABLE_A 在 TABLE_B 上插入标识大于上一个最大标识的记录。

谢谢, 戈帕尔

【讨论】:

    【解决方案3】:

    你想做的事是不可能的。 您只能使用@@identity 变量从最后一次插入中获取值。这样就可以添加到多个表中设置正确的外键,而无需使用游标再次选择刚刚插入的行。这种方法在一次插入多行时没有用。

    来自documentation: 使用@@identity 全局变量检索插入到 IDENTITY 列中的最后一个值。每次 insert 或 select into 尝试将行插入表中时,@@identity 的值都会更改。

    这是一个插入单行的过程,您可以使用返回值来创建对另一个表中插入数据的引用:

    create procedure reset_id as
        set identity_insert sales_daily on
        insert into sales_daily (syb_identity, stor_id) 
             values (102, "1349")
        select @@identity
    select @@identity
    
    execute reset_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      相关资源
      最近更新 更多