2016-03-25 15 views
4

SQL Server 2014でMERGEテーブルを使用してターゲットテーブルに行を挿入します。 ターゲットテーブルの自動インクリメンタルID列にしたいと思います。SQL SERVERでマージテーブルが一致しない列を自動インクリメントする方法はありますか?

CREATE TABLE #targetTable(id int,name varchar(50)) 
CREATE TABLE #sourceTable(id int,name varchar(50)) 

INSERT INTO #sourceTable values(1,'John'); 
INSERT INTO #sourceTable values(1,'Albrt'); 
INSERT INTO #sourceTable values(1,'Roy'); 

MERGE #targetTable AS [target] 
USING #sourceTable AS [source] 
ON [target].id = [source].id 
WHEN NOT MATCHED THEN 
INSERT (id, Name) 
VALUES ((select isnull(max(id),1) + 1 from #sourceTable), source.Name); 

select * from #targetTable as T 
drop table #targetTable 
drop table #sourceTable 

select isnull(max(id),1) + 1 from #sourceTableのようにしようとしましたが、すべての列に同じIDが割り当てられました。この1は、出力の下に、私は私の予想出力のために何をすべきかの変更

2 John 
3 Albrt 
4 Roy 

のように必要な

2 John 
2 Albrt 
2 Roy 

出力を返すのだろうか?

答えて

1
CREATE TABLE #targetTable(id int, name varchar(50)) 
CREATE TABLE #sourceTable(id int,name varchar(50)) 

INSERT INTO #sourceTable values(1,'John'); 
INSERT INTO #sourceTable values(1,'Albrt'); 
INSERT INTO #sourceTable values(1,'Roy'); 

MERGE #targetTable AS [target] 
USING 
    (
     select id, 
       name, 
       ROW_NUMBER() OVER(ORDER BY id) as rnk 
     from #sourceTable 
    ) AS [source] 
ON [target].id = [source].id 
WHEN NOT MATCHED THEN 
INSERT (id, Name) 
VALUES (rnk, source.Name); 

select * from #targetTable as T 
drop table #targetTable 
drop table #sourceTable 
+0

#テーブルの列を変更する権限がありません。 idフィールドもプライマリキーではありません。 –

+0

あなたがテストケースのために一時テーブルを使用していただけです。 ROW_NUMBER()はどうですか?それを示すために編集されました。 –

+0

id値で開始したい場合はid + ROW_NUMBER()に変更することができます。 –

関連する問題