14

IDのない主キーを使用して行をテーブルに「バッチ」挿入する必要があるクエリがあります。

--TableA
--PK int (Primary key, no-identity)
--CustNo int
INSERT INTO TableA (PK,CustNo)
  SELECT (SELECT MAX(PK)+1 AS PK FROM TableA), CustNo
  FROM Customers

(簡略化された例-同時実行の問題についてコメントしないでください:-))

問題は、処理された行ごとにPKがインクリメントされず、主キー違反が発生することです。

カーソル/whileループでそれを行う方法を知っていますが、それを避け、可能であれば、セットベースの方法で解決したいと思いますか?

(SQL Server 2008 Standardの実行)

4

5 に答える 5

28
Declare @i int;

Select @i = max(pk) + 1 from tablea;

INSERT INTO TableA (PK, custno)
Select row_number() over(order by custno) + @i  , CustNo
FROM Customers
于 2011-08-08T15:50:30.243 に答える
10

マイケル・ブエンに+1しますが、私は1つの提案があります:

テーブル「tablea」は空である可能性があるため、次のように記述します。

Select @i = isnull(max(pk),0) + 1 from tablea;

これにより、このコードを使用しようとしたときに null エラーが発生しなくなります。

于 2011-08-08T16:34:54.223 に答える
4

あなたが見たように問題は、それらがすべて同じ行番号を取得することです. max(PK) +1 はすべての行で同じです.

に変換してみてくださいMax(PK) + Row_number()

私は、なぜこれが悪い考えであるとあなたが知っているのかなどに基づいて取り組んでいます.あなたの質問は、あなたがどのように問題を解決したいかではなく、答えを得るために単純化されています.

于 2011-08-08T15:46:29.783 に答える
3

あなたはできる;

;with T(NPK, CustNo) as (
  select row_number() over (order by CustNo), CustNo from Customers
)
insert into TableA (PK, CustNo)
  select NPK, custno from T
order by CustNo 
于 2011-08-08T15:51:53.473 に答える
1

お友達に提案があります。SQL のより良いプラクティスでは、SEQUENCE を使用するように言われています。それを行うのは非常に簡単です。私のものをコピーして貼り付けるだけです。

CREATE SEQUENCE SEQ_TABLEA AS INTEGER 1 INCREMENT BY 1 MAXVALUE 2147483647 MINVALUE 1 NO CYCLE

次のように使用します。

INSERT INTO TableA (PK,CustNo) VALUES (SEQ_TABLEA.NEXTVAL,123)

このヒントがお役に立てば幸いです。

于 2015-06-18T14:12:35.427 に答える