挿入時にデフォルトで生成された一意の識別子を返します


8

ゴール

テーブルに値を挿入した後、リアルタイムで最新のGUID値を取得します

問題

それを行う方法がわからない

情報

  • コードは住所郵便番号の新しい値のみを指定する必要があります
  • テーブルには多くのデータが含まれる可能性があります

テーブル

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

1
NEWID()ではなくNEWSEQUENTIALID()を使用することをお勧めします。そうしないと、クラスター化インデックス(testIDにあると想定)が大幅に断片化されます。
Jonathan Fite 2017

回答:


13

あなたは出力を探していると思います

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はここでは最も効率的なIDではないかもしれませんが、これは上記の質問に対する回答です


ノートINSERTED.[testID]あなたが行から何をしたいの財産である、ないでプロパティの名前@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 

結果:-59A6D7FE-8C9A-4ED3-8FC6-31A989CCC8DB


質問では、デフォルトの制約によって生成された値を取得する方法を尋ねます。回避策は提供されていますが、これはその質問には答えません
Max Vernon

-4

別の方法、

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

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

SELECT @id;

質問は、default制約によって生成された値を取得する方法を尋ねます。これは回避策を提供しますが、その質問には答えません。
Max Vernon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.