Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уважаемые господа профи... / 15 сообщений из 15, страница 1 из 1
08.05.2001, 12:59
    #32005323
cube
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
как корректно узнать значение identity вставленной записи?
спасибо
...
Рейтинг: 0 / 0
08.05.2001, 13:09
    #32005325
rrr5
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
@@IDENTITY
...
Рейтинг: 0 / 0
08.05.2001, 13:20
    #32005328
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
Только запрашивай сразу после вставки.
...
Рейтинг: 0 / 0
08.05.2001, 13:25
    #32005329
cube
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
огромное спасибо.
если использовать код
insert ....
SELECT @NewID=@@IDENTITY
в stored proc, можно ли гарантировать, что в @NewID запишется результат "моего" инсерта?
еще раз thanx
...
Рейтинг: 0 / 0
08.05.2001, 13:27
    #32005330
cube
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
2 Павел:
спасибо, сразу не увидел твой месаг
...
Рейтинг: 0 / 0
08.05.2001, 14:38
    #32005334
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
А вот гарантировать, что получишь результат именно последнего ЯВНОГО insert'а, не всегда возможно. Например, если у тебя сработают триггера, которые делают вставки в таблицы, содержащие identity поля, то в @@identity получишь результат последней операции, а не своей явной.
...
Рейтинг: 0 / 0
08.05.2001, 16:28
    #32005346
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
Что-бы гарантировать, что получишь результат именно последнего ЯВНОГО insert'а, в SQL2000 можно использовать функцию SCOPE_IDENTITY()
...
Рейтинг: 0 / 0
08.05.2001, 16:54
    #32005350
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
А если речь идет о семерке, то в контексте триггера на вставку гарантия 100%
...
Рейтинг: 0 / 0
08.05.2001, 18:47
    #32005356
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
Это смотря в каком месте триггера @@identity запросить

Вот пример:

create table t1(
col1 int identity(1, 1),
col2 sysname
)

create table t2(
col1 int identity(1, 1),
col2 sysname
)

create trigger ins_t1 on t1
for insert
as
print @@identity
insert into t2 values (123)
print @@identity

insert into t2 values (456)
insert into t2 values (456)

insert into t1 values (123)

В распечатке мы увидим
1
3

Так что в начале триггера, наверное, можно запрашивать, а вот в конце не стОит. Ну и ясное дело, после отработки последнего инсерта @@identity уже покореженное, так что писать
insert into t1 values (123)
select @@identity
нельзя в принципе.
...
Рейтинг: 0 / 0
15.05.2001, 14:49
    #32005684
Уважаемые господа профи...
Стоит сразу после insert ...
Мне интересно , само увеличение identity таблицы осуществляется SQL Server-ом каким методом ?
...
Рейтинг: 0 / 0
16.05.2001, 13:27
    #32005724
AnKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
Уважаемые, позвольте вмешаться. Я так понимаю, вопрос звучал "как корректно узнать значение identity вставленной записи?" А нельзя ли вот таким макаром:
BEGIN TRAN
INSERT INTO Tab1
............

SET @NewID=(SELECT MAX(ID_Field) FROM Tab1)
COMMIT TRAN
Ясное дело, что по ID_Field - кластерный "примари кей" .

Я использую именно этот метод. Пока не подводил.

ЗЫ. Работаю с 7.0, может в 2000 есть что-то особенное и специфическое - не знаю.
...
Рейтинг: 0 / 0
17.05.2001, 05:41
    #32005767
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
2 AnKa
>BEGIN TRAN
>INSERT INTO Tab1
>............
>SET @NewID=(SELECT MAX(ID_Field) FROM Tab1)

А если у Вас в Tab1 много записей?
И insert-ы встречаются часто и юзеров работающих одновременно много? То совсем не завидую Вашим юзерам, думаю им не очень понравиться отпад по timeout-у

>COMMIT TRAN
>Ясное дело, что по ID_Field - кластерный "примари кей"

Если использовать identity field, то сразу после вставки смотреть переменную @@idenyity, а если самому это identity генерить, то соответственно и свой счетчик должен быть, поиск MAX неэффективное решение.
...
Рейтинг: 0 / 0
17.05.2001, 09:39
    #32005770
JINX
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
Вообще IMHO надо заставлять себя в первой строке каждого триггера который делает какие-либо insert'ы (а может лучше вообще в каждом - чтоб привыкнуть) писать

SET NOCOUNT ON

тогда SELECT @@IDENTITY всегда будет возвращать правильное значение.
...
Рейтинг: 0 / 0
17.05.2001, 09:53
    #32005773
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
Ну и чем тебе поможет set nocount on ? В моем примере (см. выше) добавление set nocount on ничего не изменило в поведении @@identity.

insert into t1 values (111)
select @@identity

по-прежнему будет возвращать @@identity, не соответствующую id записи, вставленной в t1.
...
Рейтинг: 0 / 0
06.08.2001, 13:44
    #32011196
MessMaker
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уважаемые господа профи...
NOCOUNT здесь вовсем ни при чем
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уважаемые господа профи... / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]