Лучший способ получить идентичность вставленной строки?

Мне пришлось добавить оба из них, чтобы заставить его работать:

describe "my test set" do
  include Rack::Test::Methods
  include ActionDispatch::TestProcess
1017
задан DineshDB 26 March 2018 в 08:14
поделиться

6 ответов

  • @@IDENTITY возвраты последнее значение идентификационных данных, сгенерированное для любой таблицы на текущей сессии, через все объемы. необходимо быть осторожными здесь , так как это через объемы. Вы могли получить значение от триггера вместо Вашего текущего оператора.

  • SCOPE_IDENTITY() возвраты последнее значение идентификационных данных, сгенерированное для любой таблицы на текущей сессии и текущей области. Обычно, что Вы хотите использовать .

  • IDENT_CURRENT('tableName') возвраты последнее значение идентификационных данных, сгенерированное для определенной таблицы на любой сессии и любом объеме. Это позволяет Вам определить, от какой таблицы Вы хотите значение, в случае, если два выше не вполне, в чем Вы нуждаетесь ( очень редкий ). Кроме того, как Парень Старбак упомянутый, "Вы могли использовать это, если Вы хотите получить текущее значение ИДЕНТИФИКАЦИОННЫХ ДАННЫХ для таблицы, в которую Вы не вставили запись".

  • OUTPUT пункт INSERT оператор позволит Вам получить доступ к каждой строке, которая была вставлена через тот оператор. Так как это ограничено по объему к определенному оператору, это [еще 1122] простой , чем другие функции выше. Однако это немного [еще 1123] подробный (необходимо будет вставить в табличную переменную / временную таблицу и затем запросить тот), и это дает результаты даже в ошибочном сценарии, где оператор откатывается. Однако если Ваш запрос использует параллельный план выполнения, это только гарантировано метод для получения идентификационных данных (за исключением выключения параллелизма). Однако это выполняется прежде триггеры и не может использоваться для возврата сгенерированных триггером значений.

1313
ответ дан Community 26 March 2018 в 08:14
поделиться

Я говорю то же самое как другие парни, таким образом, общее корректное, я просто пытаюсь сделать его более ясным.

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

SCOPE_IDENTITY(), решает эту проблему. Это возвращает идентификатор последней вещи, которую Вы вставили в код SQL , Вы отправили к базе данных. Если триггеры пойдут и создадут дополнительные строки, они не заставят неправильное значение быть возвращенным. Ура

IDENT_CURRENT возвраты последний идентификатор, который был вставлен любым. Если некоторое другое приложение, окажется, вставит другую строку в unforunate время, Вы получите идентификатор той строки вместо Вашей.

, Если Вы хотите избежать рискованных действий, всегда используйте SCOPE_IDENTITY(). Если Вы будете придерживаться с @@IDENTITY, и кто-то решает добавить триггер позже, весь Ваш код повредится.

102
ответ дан Orion Edwards 26 March 2018 в 08:14
поделиться

@@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ являются вставленным использованием последних идентификационных данных текущего Соединения SQL. Это - хорошее значение для возврата из хранимой процедуры вставки, где Вы просто нуждаетесь в идентификационных данных, вставленных для Вашей новой записи, и не заботитесь, было ли больше строк добавлено позже.

SCOPE_IDENTITY является вставленным использованием последних идентификационных данных текущего Соединения SQL, и в текущей области - то есть, если бы были вторые ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ, вставленные на основе триггера после Вашей вставки, это не было бы отражено в SCOPE_IDENTITY, только вставка, которую Вы выполнили. Откровенно говоря, у меня никогда не было причины использовать это.

IDENT_CURRENT (имя таблицы) является последними идентификационными данными, вставленными независимо от соединения или объема. Вы могли использовать это, если Вы хотите получить текущее значение ИДЕНТИФИКАЦИОННЫХ ДАННЫХ для таблицы, в которую Вы не вставили запись.

13
ответ дан Guy Starbuck 26 March 2018 в 08:14
поделиться

MSDN

@@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ, SCOPE_IDENTITY и IDENT_CURRENT являются подобными функциями в этом, они возвращают последнее значение, вставленное в столбец IDENTITY таблицы.

@@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ и SCOPE_IDENTITY возвратят последнее значение идентификационных данных, сгенерированное в любой таблице на текущей сессии. Однако SCOPE_IDENTITY возвращает значение только в текущей области; @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ не ограничены определенным объемом.

IDENT_CURRENT не ограничен объемом и сессией; это ограничено указанной таблицей. IDENT_CURRENT возвращает значение идентификационных данных, сгенерированное для определенной таблицы на любой сессии и любом объеме. Для получения дополнительной информации см. IDENT_CURRENT.

14
ответ дан Jakub Šturc 26 March 2018 в 08:14
поделиться

Еще один способ гарантировать идентификационные данные строк Вы вставка состоит в том, чтобы указать значения идентификационных данных и использовать SET IDENTITY_INSERT ON и затем OFF. Это гарантирует, что Вы знаете точно, каковы значения идентификационных данных! Пока значения не используются затем, можно вставить эти значения в столбец идентификационных данных.

CREATE TABLE #foo 
  ( 
     fooid   INT IDENTITY NOT NULL, 
     fooname VARCHAR(20) 
  ) 

SELECT @@Identity            AS [@@Identity], 
       Scope_identity()      AS [SCOPE_IDENTITY()], 
       Ident_current('#Foo') AS [IDENT_CURRENT] 

SET IDENTITY_INSERT #foo ON 

INSERT INTO #foo 
            (fooid, 
             fooname) 
VALUES      (1, 
             'one'), 
            (2, 
             'Two') 

SET IDENTITY_INSERT #foo OFF 

SELECT @@Identity            AS [@@Identity], 
       Scope_identity()      AS [SCOPE_IDENTITY()], 
       Ident_current('#Foo') AS [IDENT_CURRENT] 

INSERT INTO #foo 
            (fooname) 
VALUES      ('Three') 

SELECT @@Identity            AS [@@Identity], 
       Scope_identity()      AS [SCOPE_IDENTITY()], 
       Ident_current('#Foo') AS [IDENT_CURRENT] 

-- YOU CAN INSERT  
SET IDENTITY_INSERT #foo ON 

INSERT INTO #foo 
            (fooid, 
             fooname) 
VALUES      (10, 
             'Ten'), 
            (11, 
             'Eleven') 

SET IDENTITY_INSERT #foo OFF 

SELECT @@Identity            AS [@@Identity], 
       Scope_identity()      AS [SCOPE_IDENTITY()], 
       Ident_current('#Foo') AS [IDENT_CURRENT] 

SELECT * 
FROM   #foo 

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

0
ответ дан 19 December 2019 в 20:19
поделиться

ВСЕГДА используйте scope_identity (), НИКОГДА не нужно больше ничего.

8
ответ дан 19 December 2019 в 20:19
поделиться