8

Tôi đã đọc this question về việc nhận dạng danh tính của hàng được chèn. Câu hỏi của tôi là loại liên quan.Cách tốt nhất để lấy PK Hướng dẫn của hàng được chèn

Có cách nào để lấy chỉ dẫn cho hàng được chèn không? Bảng tôi đang làm việc với một guid là khóa chính (mặc định là newid), và tôi muốn lấy lại guid đó sau khi chèn hàng.

Có bất kỳ điều gì như @@IDENTITY, IDENT_CURRENT hoặc SCOPE_IDENTITY cho hướng dẫn không?

Trả lời

12

Bạn có thể sử dụng hàm OUTPUT để trả về giá trị mặc định trở lại tham số.

CREATE TABLE MyTable 
(
    MyPK UNIQUEIDENTIFIER DEFAULT NEWID(), 
    MyColumn1 NVARCHAR(100), 
    MyColumn2 NVARCHAR(100) 
) 

DECLARE @myNewPKTable TABLE (myNewPK UNIQUEIDENTIFIER) 

INSERT INTO 
    MyTable 
(
    MyColumn1, 
    MyColumn2 
) 
OUTPUT INSERTED.MyPK INTO @myNewPKTable 
VALUES 
(
    'MyValue1', 
    'MyValue2' 
) 

SELECT * FROM @myNewPKTable 

Tôi phải nói rằng, hãy cẩn thận khi sử dụng số nhận dạng duy nhất làm khóa chính. Lập chỉ mục trên GUID là hiệu suất cực kỳ kém khi bất kỳ guids mới được tạo ra sẽ phải được chèn vào giữa một chỉ mục và rrarely chỉ cần thêm vào cuối. Có chức năng mới trong SQL2005 cho NewSequentialId(). Nếu tối thiểu là không cần thiết với các hướng dẫn của bạn thì đó là một sự thay thế có thể.

+0

Hi, cảm ơn cho lời khuyên. Mã này trả về lỗi "Phải khai báo biến bảng" @myNewPK "". Có vẻ như bạn chỉ có thể xuất vào một bảng. Tôi đã có nó làm việc bằng cách tuyên bố một bảng tạm thời và sau đó chọn id từ bảng. Cảm ơn sự giúp đỡ của bạn và lời khuyên về hiệu suất kém của Guids. –

+0

Xin lỗi, tôi đã không thử nghiệm nó, chỉ là ném nó với nhau từ những gì tôi nhớ. Bây giờ đã cập nhật câu trả lời với nó trả về một biến bảng. –

+0

Rất tốt, cảm ơn Robin. Đã chấp nhận :) –

1

Một cách tiếp cận sạch, nếu chèn một hàng duy nhất

CREATE TABLE MyTable 
(
    MyPK UNIQUEIDENTIFIER DEFAULT NEWID(), 
    MyColumn1 NVARCHAR(100), 
    MyColumn2 NVARCHAR(100) 
) 

DECLARE @MyID UNIQUEIDENTIFIER; 
SET @MyID = NEWID(); 

INSERT INTO 
    MyTable 
(
    MyPK 
    MyColumn1, 
    MyColumn2 
) 
VALUES 
(
    @MyID, 
    'MyValue1', 
    'MyValue2' 
) 

SELECT @MyID;