2011-08-08 26 views
11

Tôi có một truy vấn mà tôi cần phải "bó" hàng chèn vào một bảng có khóa chính không có nhận dạng.T-SQL, Chèn vào với MAX() + 1 trong truy vấn phụ không tăng, lựa chọn thay thế?

--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 

(ví dụ đơn giản - vui lòng không bình luận về vấn đề đồng thời có thể :-))

Vấn đề là nó không tăng PK "cho mỗi" hàng chế biến, và tôi nhận được một vi phạm chính tiểu học.

Tôi biết cách thực hiện điều đó bằng vòng lặp con trỏ/vòng lặp, nhưng tôi muốn tránh điều đó và giải quyết theo cách được thiết lập, nếu điều đó có thể xảy ra?

(chạy SQL Server 2008 Standard)

+4

Tại sao bạn không đặt cột này thành cột nhận dạng? – Chandu

+0

+1 @Cybernate - đây là một ý tưởng khủng khiếp và nếu bạn đã lo lắng tìm kiếm trên SO có khoảng 20 câu hỏi tương tự như thế này, mỗi câu hỏi cho bạn biết tại sao đó là một ý tưởng tồi. – JNK

+0

Câu chuyện dài ngắn: tôi sẽ tạo một danh tính nếu tôi có thể :-). @ JNK tôi làm phiền hoàn toàn, nhưng đó là lựa chọn duy nhất của tôi, và tôi muốn giải quyết nó theo cách tốt nhất có thể. Cũng nhớ tôi cung cấp một ví dụ đơn giản. – KorsG

Trả lời

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

Công việc, nhờ trả lời nhanh :-) – KorsG

+2

Hãy coi chừng điều kiện chủng tộc. – HLGEM

4

Vấn đề là bạn đã thấy là tất cả họ đều có được số lượng hàng tương tự, tối đa (PK) +1 là như nhau cho mỗi hàng.

Hãy thử chuyển nó sang được Max(PK) + Row_number()

Tôi đang làm việc trên cơ sở là tại sao bạn biết đây là một ý tưởng tồi vv, và câu hỏi của bạn được đơn giản hóa với mục đích nhận được một câu trả lời, và không phải là cách bạn muốn giải quyết vấn đề.

+0

Điều này sẽ giúp ích. http://stackoverflow.com/questions/13845791/insert-multiple-rows-with-incremental-primary-key-sql –

3

Bạn có thể;

;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 để Michael Buen, nhưng tôi có một đề nghị:

Bảng "TableA" thể để trống, vì vậy chúng ta nên viết:

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

Điều này sẽ ngăn chặn một lỗi trống khi cố gắng sử dụng mã này.

1

Tôi có một gợi ý cho bạn Buddy, một thực hành tốt hơn trên SQL nói để sử dụng SEQUENCE, và đoán những gì, nó rất dễ dàng để làm điều đó người đàn ông, chỉ cần sao chép và mỏ dán:

CREATE SEQUENCE SEQ_TABLEA AS INTEGER BẮT ĐẦU VỚI 1 tăng 1 MAXVALUE 2147483647 MINVALUE 1 KHÔNG VÒNG

và sử dụng như thế này:

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

Hope mẹo này có thể giúp ya!

+2

Cảm ơn bạn đã trả lời, nhưng câu hỏi ban đầu liên quan đến SQL Server 2008 và SEQUENCE chỉ có sẵn cho SQL Server 2012+ – KorsG

Các vấn đề liên quan