Trả về định danh duy nhất được tạo bởi một mặc định khi chèn


8

Mục tiêu

Truy xuất giá trị hướng dẫn mới nhất trong thời gian thực sau khi bạn đã chèn giá trị vào bảng

Vấn đề

Không biết làm thế nào để làm điều đó

Thông tin

  • Mã chỉ nên xác định giá trị mới cho địa chỉmã zip
  • Có thể có nhiều dữ liệu trong bảng

Bàn

CREATE TABLE [AddressBook]
(
    [testID] [uniqueidentifier] NOT NULL default newid(),
    [address] [nvarchar](50) NULL,
    [zipcode] [nvarchar](50) NULL
)

1
Tôi sẽ đề nghị sử dụng NEWSEQUENTIALID () thay vì NEWID (), nếu không, chỉ mục được nhóm của bạn (giả sử nó sẽ nằm trên testID) sẽ bị phân mảnh nhiều.
Jonathan Fite

Câu trả lời:


13

Tôi nghĩ rằng bạn đang tìm kiếm đầu ra

DECLARE @MyTableVar table([testID] [uniqueidentifier]);
 INSERT [AddressBook] ([address], [zipcode])
        OUTPUT INSERTED.[testID] INTO @MyTableVar
 VALUES (N'address', N'zipcode');

--Display the result set of the table variable.
 SELECT [testID] FROM @MyTableVar;

GO

uniqueidentifier có thể không phải là id hiệu quả nhất ở đây nhưng đây là câu trả lời cho câu hỏi đã nêu


lưu ý rằng đó INSERTED.[testID]là tài sản của những gì bạn muốn từ hàng, không phải tên của tài sản trong@MyTableVar
smurtagh

-1
CREATE TABLE [dbo].[tbl_Clients](
    [ClientID] [uniqueidentifier] NULL,
    [ClientName] [varchar](250) NULL,
    [ClientEnabled] [bit] NULL
) ON [PRIMARY]

GO

CREATE PROCEDURE [dbo].[sp_ClientCreate]
@in_ClientName varchar(250) = "New Client 123",
@in_ClientEnabled bit,
@out_ClientId uniqueidentifier OUTPUT
AS

SET @out_ClientId = NEWID();

INSERT
INTO tbl_Clients(ClientId, ClientName, ClientEnabled) 
VALUES(
@out_ClientId, 
@in_ClientName,
@in_ClientEnabled)


DECLARE @return_value int,
        @out_ClientId uniqueidentifier

EXEC    @return_value = [dbo].[sp_ClientCreate]
        @in_ClientName = N'111',
        @in_ClientEnabled = 1,
        @out_ClientId = @out_ClientId OUTPUT

SELECT  @out_ClientId as N'@out_ClientId'

SELECT  'Return Value' = @return_value

GO 

Kết quả: -59A6D7FE-8C9A-4ED3-8FC6-31A989CCC8DB


Câu hỏi hỏi làm thế nào để có được giá trị được tạo bởi ràng buộc mặc định. Điều này không trả lời câu hỏi đó, mặc dù nó cung cấp một cách giải quyết
Max Vernon

-4

Nói chung, có hai cách khác nhau để có được giá trị Nhận dạng sau khi thực hiện thao tác chèn, sử dụng SQL SERVER SCOPE_IDENTITY / IDENT_CURRENT / @@ IDENTITY hoặc SQL SERVER OUTPUT .

  1. SQL SERVER SCOPE_IDENTITY / IDENT_CURRENT / @@ IDENTITY. Trong khi SCOPE_IDENTITY / IDENT_CURRENT / @@ IDENTITY thực hiện chức năng tương tự, các giá trị được trả về từ mỗi khác nhau tùy thuộc vào phạm vi hiện tại, chẳng hạn như quy trình được lưu trữ, kích hoạt, từng đợt. Các tài liệu nên được đọc và hiểu trước khi xác định cái nào sẽ sử dụng.

    CREATE TABLE Test (TestID INT IDENTITY (1,1), TestName VARCHAR (20) KHÔNG NULL)

    GIÁ TRỊ KIỂM TRA ('Test1', 'Test2', 'Test3'); CHỌN @@ IDENTITY, SCOPE_IDENTIY ();

    Trong ví dụ này, cả @@ IDENTITY, SCOPE_IDENTIY () sẽ trả về 3 vì chúng nằm trong cùng một phạm vi. Tùy thuộc vào phạm vi mặc dù họ có thể trả về các giá trị khác nhau.

  2. Đầu ra SQL SERVER cho phép bạn truy cập tất cả các hàng được trả về từ câu lệnh INSERT / DELETE / UPDATE hoặc Merge. Bạn có thể cần phải sử dụng một biến để truy cập danh tính. Các liên kết cung cấp thông tin toàn diện hơn.


Mặc dù SCOPE_IDENTITY(), v.v., sẽ hoạt động cho identity()các cột, nhưng nó không hoạt động đối với uniqueidentifiercác cột có ràng buộc newid()hoặc newsequentialid()mặc định.
Max Vernon

-4

Cách khác,

DECLARE @id varchar(50) = CONVERT(VARCHAR(50), NEWID());

INSERT INTO [yourtable]
( [id])
VALUES
(@id);

SELECT @id;

Câu hỏi hỏi làm thế nào để có được giá trị được tạo ra bởi các defaultràng buộc. Điều này không trả lời câu hỏi đó, mặc dù nó cung cấp một cách giải quyết.
Max Vernon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.