2011-08-08 4 views
11

私は一意のキーなしでテーブルに行を挿入する必要があるクエリを持っています。T-SQL、副問合せでMAX()+ 1を挿入すると、代替値が増えませんか?

--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の標準)

+4

なぜ列をID列にしないのですか? – Chandu

+0

+1 @Cyber​​nate - これはひどい考えです。だから、検索するのが面倒だった場合は、これに似た約20の質問があり、それぞれがなぜ悪い考えであるかを教えてくれます。 – JNK

+0

短いストーリー:もし私ができるなら、私はアイデンティティを作るだろう:-)。 @JNK私は大丈夫でしたが、それは私の唯一の選択肢であり、可能な限り最良の方法で解決したいのです。また、私は単純化された例を提供したことに留意してください。 – KorsG

答えて

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

仕事をしていますか?返信ありがとう:-) – KorsG

+2

競合状態に注意してください。 – HLGEM

4

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

、私はあなたがこのなど悪いアイデアであり、あなたの質問に答えを得ることを目的として簡素化、およびないどのようにされて知っている理由をもとに働いていることがMax(PK) + Row_number()

ことに変換してください問題を解決したいと考えています。

+0

これは役に立ちます。 http://stackoverflow.com/questions/13845791/insert-multiple-rows-with-incremental-primary-key-sql –

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 
7

マイケルブエンに+1が、私は持っている1つの提案:

テーブル "TABLEA" 空にすることができますので、私たちが書く必要があります。

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

これがnullエラーを防ぐことができますがこのコードを使用しようとしています。

1

私はSQLのより良い練習がSEQUENCEを使用すると言う、あなたはバディのための提案を持っており、それを人間が行うのは非常に簡単it's何か、推測、単にコピー&ペースト鉱山:

をCREATE SEQUENCE

:1 MAXVALUE 2147483647 MINVALUE 1 NO CYCLE

と、次のように使用して1つの INCREMENT WITH INTEGER START AS SEQ_TABLEA

テーブルA INTO INSERT(PK、CUSTNO)VALUES(SEQ_TABLEA.NEXTVAL、123)

希望屋を助けることができるこのヒント!

+2

お返事ありがとうございますが、元の質問はSQL Server 2008に関するものであり、SEQUENCEはSQL Server 2012+ – KorsG

関連する問題