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

Вид: 11405|Ответ: 0

[Чаевые] SQL получает значение первичного ключа после ожидания INSERT

[Скопировать ссылку]
Опубликовано 05.05.2015 17:35:51 | | |

Функция извлечения идентификационных значений в SQL SERVER 2000     
  В SQL Server 2000 столбец идентичности определяется как IDENTITY, и следующее связано с получением значения идентичности последней вставленной записи   
   
  Пример иллюстрации функции off     
   
          В SQL Server можно использовать SCOPE_IDENTITY(), @@IDENTITY, IDENT_CURRENT() для получения значения последней вставленной записи, и разница между ними такова:   
  SCOPE_IDENTITY() возвращает последнее значение IDENTITY, вставленное внутри столбца IDENTITY в той же области. Область — это модуль — хранящиеся процедуры, триггеры, функции   
   
  Номера или партии. Следовательно, если два оператора находятся в одной и той же хранимой процедуре, функции или пакете, они находятся в одной области.   
  @@IDENTITY Возвращает последнее значение идентификации, сгенерированное во всех таблицах текущей сессии   
  IDENT_CURRENT() возвращает последнее значение идентификации, сгенерированное для указанной таблицы в любой сессии и в любой области   
  Вот пример, чтобы проиллюстрировать их различия     
   
  -- a) Пример кода     
  --   ===========================================   
  -- Создать тестовую таблицу   
  --   ===========================================   
  ИСПОЛЬЗУЙТЕ tempdb   
  ВПЕРЁД   
   
  CREATE TABLE t1(id int IDENTITY, col int)   
  ВСТАВИТЬ T1 SELECT 1   
  ЮНИОН ALL SELECT 2   
  CREATE TABLE t2(id int IDENTITY, col int)   
  ВПЕРЁД   
   
  СОЗДАТЬ TR_insert_t2 ТРИГГЕРА На T2   
  ДЛЯ ВСТАВКИ   
  AS   
          ВСТАВИТЬ t1 SELECT 3   
  ВПЕРЁД     
   
  --   ===========================================   
  -- Проверьте три функции: 1   
  --   ===========================================   
  ВСТАВИТЬ ЗНАЧЕНИЯ T2(1)   
  ВЫБЕРИТЕ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),   
          [@@IDENTITY]=@@IDENTITY,   
          [IDENT_CURRENT() для t1]=IDENT_CURRENT(N't1'),   
          [IDENT_CURRENT() для t2]=IDENT_CURRENT(N't2')   
   
  /*--Результат   
  SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Для t1 IDENT_CURRENT() Для t2                                         
  ------------------   ------------   --------------------------   -----------------------   
  1                                     3                         3                                                     1   
   
  (Количество затронутых строк — 1 ряд)   
  --*/   
  ВПЕРЁД   
   
  --   ===========================================   
  -- Проверьте три функции: 2   
  --   ===========================================   
  ВСТАВЬТЕ ЗНАЧЕНИЯ T1(10)   
  ВЫБЕРИТЕ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),   
          [@@IDENTITY]=@@IDENTITY,   
          [IDENT_CURRENT() для t1]=IDENT_CURRENT(N't1'),   
          [IDENT_CURRENT() для t2]=IDENT_CURRENT(N't2')   
   
  /*--Результат   
  SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Для t1 IDENT_CURRENT() Для t2                                         
  ------------------   ------------   --------------------------   -----------------------   
  4                                     4                         4                                                     1   
   
  (Количество затронутых строк — 1 ряд)   
  --*/   
  ВПЕРЁД   
   
  --   ===========================================   
  -- Проверьте три функции: 3   
  -- ** Откройте новое соединение и выполните следующий код **   
  --   ===========================================   
  ВЫБЕРИТЕ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),   
          [@@IDENTITY]=@@IDENTITY,   
          [IDENT_CURRENT() для t1]=IDENT_CURRENT(N't1'),   
          [IDENT_CURRENT() для t2]=IDENT_CURRENT(N't2')   
   
  /*--Результат   
  SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Для t1 IDENT_CURRENT() Для t2                                         
  ------------------   ------------   --------------------------   -----------------------   
  NULL NULL 4 &n     
   
  --===========================================   
  -- Удалить тестовую среду   
  --   ===========================================   
  ТАБЛИЦА ВЫБРОСА T1,T2     
   
  -- b) Описание результата кода     
  Как видно из приведённого выше кода:   
  IDENT_CURRENT() всегда возвращает последнее идентифицированное значение, вставленное в указанную таблицу   
  @@IDENTITY Возвращает значение идентичности текущей сессии, независимо от того, находится ли она в той же области действия или нет, в тестах 1 и 2 видно, что оно возвращает значение идентификатора вставленной записи в триггере, и в   
   
  В тесте 3 возвращается NULL, потому что в текущей сессии нет записи вставки   
  SCOPE_IDENTITY() возвращает значение идентификации того же объёма текущей сессии, поэтому в тесте 1, 2 возвращается значение, не затрагиваемое триггером, а в тесте 3 — поскольку текущая сессия не интерполируется   
   
  запись, поэтому возвращает NULL





Предыдущий:Почему все поехали на первомайский праздник?
Следующий:В чём разница между тем, чтобы SCOPE_IDENTITY() писался до и после в t-sql?
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com