Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Как правильно получить ID записи после INSERT (число прочтений - 2022 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Как правильно получить ID записи после INSERT
20. Сентября 2010 :: 12:22
Печать  
Имею табличку с двумя колонками:
Код
Выбрать все
CREATE TABLE [dbo].[TestTable](
	[ID] [bigint] IDENTITY(1,1) NOT NULL,
	[Value] [varchar](50) NULL
) ON [PRIMARY] 


Хочу из 1С вставить строку таким образом:
Код
Выбрать все
_Запрос = НовыйЗапрос();
		ТекстЗапроса = "
		|INSERT INTO TestTable (
		|	[Value]
		|)
		|VALUES (
		|	:Значение
		|)";

		_Запрос.УстановитьТекстовыйПараметр("Значение",ЧтоТо);
		_Запрос.ВыполнитьСкалярный(ТекстЗапроса); 



Как правильно получить сформированный автоматом ID?

Добавлять SET NOCOUNT ON и в конце запроса делать что-то вроде:
Код
Выбрать все
SELECT MAX(ID) FROM TestTable 


? Выглядит как-то ненадежно.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как правильно получить ID записи после INSERT
Ответ #1 - 20. Сентября 2010 :: 12:26
Печать  
покажи что генерит Отладка(1)
скорее всего строку надо в '' помещать.

какая версия sql ?
select  @@version
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как правильно получить ID записи после INSERT
Ответ #2 - 20. Сентября 2010 :: 12:28
Печать  
SELECT @@IDENTITY
  

1&&2&&3
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как правильно получить ID записи после INSERT
Ответ #3 - 20. Сентября 2010 :: 13:08
Печать  
BOL - @@IDENTITY, SCOPE_IDENTITY()
  
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как правильно получить ID записи после INSERT
Ответ #4 - 20. Сентября 2010 :: 13:39
Печать  
Я так понимаю должно выглядеть так:
Код
Выбрать все
ТекстЗапроса = "SET NOCOUNT ON
		|INSERT INTO TestTable (
		|	[Value]
		|)
		|VALUES (
		|	:Значение
		|)
|GO
|SELECT @@IDENTITY"; 


Правильно?
Меня смущает другой момент. Если выполняется много таких запросов, то не может ли возникнуть ситуация, когда первый запрос вставил значения, затем второй вставил значение и только потом выполнилось "SELECT @@IDENTITY" из первого запроса?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как правильно получить ID записи после INSERT
Ответ #5 - 20. Сентября 2010 :: 14:03
Печать  
@@IDENTITY возвращает последний идентити в текущем сеансе
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как правильно получить ID записи после INSERT
Ответ #6 - 20. Сентября 2010 :: 14:05
Печать  
Правильно смущает
сразу же после insert надо куда либо сохранить @@identity
лучше использовать не @@identity а SCOPE_IDENTITY()
разницу смотри по ссылке http://technet.microsoft.com/ru-ru/library/ms190315.aspx


Также не забудь что свойство колонки IDENTITY
не обеспечивает уникальности.
Для уникальности на этой колонке необходимо еще на этой колонке создать уникальный индекс ( чего нет в subj )
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать