2011-08-08 45 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「爲每個」處理行,我獲得主鍵違規。

我知道如何用cursor/while循環來做到這一點,但我想避免這種情況,並以集合爲基礎的方式來解決它,如果這甚至是可能的?

(運行SQL Server 2008標準)

+4

爲什麼你不把列設置爲標識列? – Chandu

+0

+1 @Cyber​​nate - 這是一個可怕的想法,如果你打算搜索SO,大約有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邁克爾·布恩,但我有一個建議:

表 「表A」 可以是空的,所以我們應該寫:

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

這將防止一個空的錯誤當試圖使用這個代碼。

1

我對你好友的建議,在SQL一個更好的做法表示使用SEQUENCE,你猜怎麼着,it's很容易做到這一點的人,只是複製和粘貼礦山:

CREATE SEQUENCE SEQ_TABLEA AS INTEGER 1個 增量開始時由1 MAXVALUE 2147483647 MINVALUE 1 NO CYCLE

,並使用這樣的:

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

希望這個技巧能幫助你!

+2

感謝您的回答,但最初的問題是關於SQL Server 2008,而SEQUENCE僅適用於SQL Server 2012+ – KorsG