2013-09-26 81 views
1

我有一個場景,其中一列目標表需要自動增加。本專欄沒有啓用身份驗證。所以我需要選擇最後一個數字並在其中添加1,每次插入完成。使用MERGE進行增量插入

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

類似的情況在撥弄鏈接給出。我不希望插入ProductChanges表的productid。相反,我需要選擇最後一個ID,我需要它爲每個新行增加和插入

+1

這不是合併的具體。此外,此特殊身份驗證方案將一次限制對此表的一個插入事務的併發性。根本沒有併發。 – usr

+1

採取一些提示,並在表上實施適當的觸發器,我已經解釋了我早期堆棧答案中的simillar情況.http://stackoverflow.com/questions/18891796/create-sequence-in-ms-sql-server-2008/ 18957485#18957485 – Pratik

+0

是的..看起來像而不是觸發器應該工作正常。將嘗試 – mhn

回答

3

代碼得到這個工作

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; 
+0

所以你不在2008年。 –

+0

我在sql server 2012上 – mhn

0

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; 
+1

序列的概念在[tag:sqL-server-2012]不在[tag:sqL-server-2008]中工作,它看起來像你有'oracle'的意思,而MSsql中的數據庫 – Pratik

+1

我試過使用Sql- server-2012序列語句。拋出此錯誤NEXT VALUE FOR函數只能在MERGE中使用,如果它在目標表的默認約束內定義的插入操作。 – mhn

+0

繼續進行序列功能。添加了默認約束,如http://www.duncansutcliffe.com/?p=347中給出的。它的工作! – mhn