Получить значение ключа уникального идентификатора для записи - PullRequest
4 голосов
/ 04 декабря 2008

в контексте SQL Server 2005 у меня есть таблица, для которой первичным ключом является уникальный идентификатор (GUID) со значением по умолчанию, сгенерированным функцией newid (). Я хочу написать хранимую процедуру, которая вставляет новую запись в таблицу. Как я могу получить значение PK записи? для объявленного идентификатора поля это легко - я вызываю scope_identity (). Как мне поступить с гидами?

Спасибо, Lucian

Ответы [ 8 ]

4 голосов
/ 04 декабря 2008

Генерация GUID перед вставкой приводит к фрагментации индекса.

Нет необходимости объявлять GUID перед вставкой,

Я бы порекомендовал:

  1. Использование ограничения по умолчанию NEWSEQUENTIALID для генерации смежных направляющих. (это устранит фрагментацию индекса - хорошо известная проблема с Guids в качестве первичного ключа).

  2. Используйте новое предложение OUTPUT (новое в sql server 2005), которое позволит вам получить вновь вставленный GUID.

Пример ниже:

DECLARE @outputTblCustomer1 TABLE (CustomerID uniqueidentifier)

-- Customer1  

INSERT INTO dbo.Customer1 (CustomerNumber, LastName) OUTPUT INSERTED.CustomerID INTO @outputTblCustomer1 VALUES (-1, N'LastName')  

SELECT CustomerID FROM @outputTblCustomer1

-- Customer3 

INSERT INTO dbo.Customer3 (CustomerNumber, LastName) VALUES (-1, N'LastName')  

SELECT SCOPE_IDENTITY() AS CustomerID
3 голосов
/ 04 декабря 2008

Я бы сгенерировал новый Guid до вставки записи и явно использовал бы этот новый Guid в качестве PK для записи. Затем вы используете этот guid после вставки, зная, что он относится к только что вставленной строке, например,

DECLARE @newGuid uniqueidentifier
SET @newGuid = newid()

INSERT INTO myTable(id, stringval)
VALUES (@newGuid, "Hello")

SELECT * FROM myTable
WHERE id = @newGuid
1 голос
/ 04 декабря 2008

Вам потребуется создать уникальный идентификатор в хранимой процедуре и вставить его в таблицу, а затем вернуть значение после завершения вставки.

CREATE PROCEDURE insNewGuidIdRow 
    @newId  UNIQUEIDENTIFIER output,
    @otherData  NVARCHAR(10)
AS
BEGIN
    SET @newId = NEWID()

    INSERT INTO GuidIdTable(id, otherData)
    VALUES (@newId, @otherData)
END

Он будет просто использовать вставленное значение вместо создания нового guid в качестве значения по умолчанию.

0 голосов
/ 23 марта 2013

Используйте это, что работает для меня

  DECLARE @id uniqueidentifier;
  SELECT @id=NEWID()    
  INSERT INTO MyTable(ID,other)
  VALUES(@id,'other');
0 голосов
/ 07 марта 2010

со столом типа:

CREATE TABLE [dbo].[TableName ](
    [Code] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [Name] [nvarchar](100) NOT NULL)

ALTER TABLE [dbo].[TableName ] ADD  CONSTRAINT [DF_Questionnaire_Code]  DEFAULT (newid()) FOR [Code]

и вставка SQL вроде:

INSERT INTO TableName (Name)
OUTPUT  Inserted.Code AS NewGUID
VALUES  ('TEST')

Вы получите НОВЫЙ GUID в качестве вывода:

NewGUID
------------------------------------
F540C0F8-ADBC-4054-BAB6-1927DE59FA99
0 голосов
/ 04 декабря 2008

Для запросов:

если ваш столбец первичного ключа является первым столбцом Используйте executetescalar () для выполнения вставки stmt ...

вернет первый столбец первой строки в наборе результатов, возвращенных запросом.

Для процедуры: INSERT INTO tblBrowser (IDString) ЗНАЧЕНИЯ (@IDString) SET @ID = @@ Identity объявить ado paramater конкретно как возвратите параметр, и он получит значение, возвращаемое sproc Установите par = .CreateParameter ("intOutput", adVarChar, adParamOutput, 30).

0 голосов
/ 04 декабря 2008

Если вы уже находитесь в хранимой процедуре, вы можете получить newid (), выполнить вставку и вернуть guid:

CREATE PROCEDURE Insert_myTable(@values...) AS

DECLARE @pk GUID
SET @pk = NEWID()

INSERT INTO myTable(PKID, values...) VALUES (@pk, @values...)

SELECT @pk
0 голосов
/ 04 декабря 2008

Вы можете вернуть его как строку, используя оператор SELECT или параметр OUTPUT, если это по одной строке за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...