【问题标题】:using MERGE for incremental insert使用 MERGE 进行增量插入
【发布时间】:2013-10-02 03:19:27
【问题描述】:

我有一个场景,目标表的一列需要自动递增。我没有在此列上启用身份。因此,每次插入完成时,我都需要选择最后一个数字并将其加 1。

http://sqlfiddle.com/#!6/61eb4/5

小提琴链接中给出了类似的场景。我不想插入 ProductChanges 表的 productid。相反,我需要选择最后一个 id,并且我需要为每个新行递增和插入它

【问题讨论】:

  • 这不是特定的合并。此外,这种特殊的身份方案将限制并发一次针对该表的一个插入事务。根本没有并发。
  • 采取一些提示并在桌子上实施适当的触发器,我已经在我之前的堆栈答案中解释了类似的情况。stackoverflow.com/questions/18891796/…
  • 是的.. 看起来代替触发器应该可以正常工作。会试一试
  • 在使用合并时,似乎需要为所有操作启用而不是触发器,而不仅仅是插入。

标签: sql sql-server merge sql-server-2012


【解决方案1】:

实现此功能的代码

DECLARE @intctr int
SELECT @intctr = MAX(productid)+1 from products
DECLARE @strQry varchar(200)
SET @strQry = 
'CREATE SEQUENCE dbo.seq_key_prd
    START WITH ' +convert( varchar(12),@intctr) +'  INCREMENT BY 1 ;'
    print @strQry
    exec( @strQry)


alter table Products
    add default next value for seq_key_prd
    for ProductId;
GO


--Merge statement for data sync
MERGE Products USING ProductChanges ON (Products.Productid = ProductChanges.Productid)
WHEN MATCHED AND Products.VendorlD =0 THEN DELETE
WHEN NOT MATCHED by target then insert (productid,Productname,VendorlD)
values(default,productname,VendorlD)
 WHEN MATCHED THEN UPDATE SET
Products.ProductName = ProductChanges.ProductName ,
Products.VendorlD = ProductChanges.VendorlD;

【讨论】:

  • 那么你不在 2008 年。
  • 我在 sql server 2012 上
【解决方案2】:

1)创建序列并设置到目标表。

例子

CREATE SEQUENCE table_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;

2)为该序列创建触发器,以设置表

CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT 
ON myTable
FOR EACH ROW
WHEN (new.id is null)
DECLARE
v_id qname.qname_id%TYPE;
BEGIN 
SELECT table_seq.nextval INTO v_id FROM DUAL;
:new.qname_id := v_id;
END my_trigger;

【讨论】:

  • 序列的概念在 sql-server-2012 中有效,在 sql-server-2008 中无效,看起来您在 MSsql 中的数据库时想到了 oracle
  • 我尝试使用 Sql-server-2012 序列语句。抛出此错误 NEXT VALUE FOR 函数只能与 MERGE 一起使用,前提是它是在目标表的默认约束中为插入操作定义的。
  • 继续使用序列功能。添加了duncansutcliffe.com/?p=347 中给出的默认约束。它奏效了!
猜你喜欢
  • 2015-01-24
  • 2017-01-24
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多