よく、単一の行のための直接的な方法:
insert into table(c1,c2,pos)
select 'c1','c2',1+isnull((select max(pos) from table),0)
は、値の複数のセットのためには、このような何かを行うことができます:
create table t (c1 char(2), c2 char(2), pos int);
insert into t (c1,c2,pos)
select v.c1,v.c2,row_number() over (order by (select 1))+x.MaxPos
from (values ('c1','c2'),('d1','d2'),('e1','e2')) v (c1,c2)
cross join (
select MaxPos = isnull(max(pos),0)
from t
) x;
select * from t;
rextesterデモ:http://rextester.com/DVJB25196
リターン:
+----+----+-----+
| c1 | c2 | pos |
+----+----+-----+
| c1 | c2 | 1 |
| d1 | d2 | 2 |
| e1 | e2 | 3 |
+----+----+-----+
これは**非常に**問題です。同じ時刻に行を追加しようとする2つのプロセス、max [pos]に同じ値を取得し、同じpos値を持つ2つの異なる行を追加しようとする2つのプロセスのリスクがあります。おそらくあなたの最善の賭けは私の答えのようなものですが、私はまだ解決策が気に入らないのです。 –