Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сброс SCOPE_IDENTITY  [new]
Edo
Member

Откуда: Киев
Сообщений: 5
----------------------------------------
CREATE TABLE [dbo].[test] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[about] [char] (10) NULL
) ON [PRIMARY]
----------------------------------------
CREATE TABLE [dbo].[test_detail] (
[id] [int] NOT NULL ,
[about_detail] [char] (10) NULL
) ON [PRIMARY]
----------------------------------------
почему выполнение данного скрипта выдаст ошибку?
insert into test(about) values('master');
insert into test_detail(id, about_detail) values(SCOPE_IDENTITY(), 'detail-1');
insert into test_detail(id, about_detail) values(SCOPE_IDENTITY(), 'detail-2');

одним словом - почему SCOPE_IDENTITY() сбрасывает свое значение в NULL после вставки записи в таблицу test_detail, в которой ни о каких полях identity речи не идет? Получается, что SCOPE_IDENTITY() становится NULL при любых инсертах в таблицу из БД. Но это же нонсенс!!!
16 апр 04, 14:27    [633045]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36377
автор
в которой ни о каких полях identity речи не идет?

Потому и сбрасывает, что не идет речи.
Читаем после первого инсерта scope_identity в переменную и далее пользуемся ею.
автор
Получается, что SCOPE_IDENTITY() становится NULL при любых инсертах в таблицу из БД. Но это же нонсенс!!!

Наоборот, очень даже логично.
16 апр 04, 14:31    [633056]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
Edo
Member

Откуда: Киев
Сообщений: 5
Я позволю не согласится и процитировать официальную документацию:
"Returns the last IDENTITY value inserted into an IDENTITY column in the same scope."
Перевод: "Возвращает последнее значение IDENTITY вставленное в поле IDENTITY". Я именно в IDENTITY вторым и третьим инсертом не вставляю. Я вставляю в другую таблицу, где полей с IDENTITY нет вообще.
16 апр 04, 14:34    [633066]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36377
автор
Я именно в IDENTITY вторым и третьим инсертом не вставляю

не дочитали:
FIXED]The SCOPE_IDENTITY() function will return the NULL value if the function is invoked before any insert statements into an identity column occur in the scope
Во втором инсерте у Вас как раз это is invoked before any insert statements into an identity column occur in the scope
16 апр 04, 14:40    [633089]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
stakan
Guest
2Гавриленко Сергей Алексеевич

Да как же так? В нашем случае это не работает.
В нашем случае scope - это батч. А в батче уже вызывалось insert statements into an identity column.
16 апр 04, 14:46    [633109]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
stakan
Guest
В нашем случае подходит вот что по идее:
BOL : If the statement did not affect any tables with identity columns, @@IDENTITY returns NULL.
16 апр 04, 14:49    [633121]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36377
автор
А в батче уже вызывалось insert statements into an identity column.

В предыдущем статменте не вызывалось.
Does your second statement insert any identity column? No.
16 апр 04, 14:53    [633135]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23903
Вот же, как говорится, из мухи слона!!!

Почему так не написать?

declare @s int


insert into test(about) values('master');

select @s=SCOPE_IDENTITY()

insert into test_detail(id, about_detail) values(@s, 'detail-1');
insert into test_detail(id, about_detail) values(@s, 'detail-2');

И никаких проблемм!
16 апр 04, 15:00    [633157]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36377
автор
Почему так не написать?

Я так своим первым постом и посоветовал. Но человек правды хочет.
16 апр 04, 15:03    [633170]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
stakan
Guest
2Гавриленко Сергей Алексеевич
Вопрос неверно поставлен:
Не так надо
Does your second statement insert any identity column? No
А вот как
Does your scope have any insert statements into an identity column на момент второго стейтмента? YES :-)
16 апр 04, 15:03    [633173]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
Edo
Member

Откуда: Киев
Сообщений: 5
Проблемы нет. Просто из документации не следует, что любой insert скинет значение SCOPE в null, если даже insert идет в таблице без каких-либо полей с IDENTITY. Нет явного указания. Это и вызвало недоумение. А как использовать переменные для решения возникшей ситуации - я знаю. Всё равно спасибо за твой ответ.
16 апр 04, 15:04    [633174]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36377
Пишем мелкомягкому на прдмет кривой документации? :)
16 апр 04, 15:05    [633180]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
Crimean
Member

Откуда:
Сообщений: 13144
Вы еще инстедный триггер создайте - прослезитесь.
16 апр 04, 15:06    [633182]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23903
Во народ! Лень две строчки кода дописать!
Правду им подавай! А БОЛ читать внимательно не охота!
16 апр 04, 15:06    [633185]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36377
автор
Правду им подавай! А БОЛ читать внимательно не охота!

В общем-то, в боле действительно именно про scope_identity не написано, что If the statement did not affect any tables with identity columns, @@IDENTITY returns NULL., хотя очень даже логично, что он null в данном случае возвращает.
16 апр 04, 15:10    [633198]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Сброс SCOPE_IDENTITY  [new]
Gerros
Member

Откуда: Харьков
Сообщений: 429
Гавриленко Сергей Алексеевич
Пишем мелкомягкому на пердмет кривой документации? :)
а было бы неплохо... у меня наблюдается явное расхождение с документацией.
SCOPE_IDENTITY (Transact-SQL):
Returns the last identity value inserted into an identity column in the same scope. A scope is a module: a stored procedure, trigger, function, or batch. Therefore, if two statements are in the same stored procedure, function, or batch, they are in the same scope.
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
Oct 20 2015 15:36:27
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
--create table scope_identity_test( id int identity, q int)
go
select '1. must be Null:', scope_identity()
insert scope_identity_test select 1
go
select '2. must be Null:', scope_identity()
--drop table scope_identity_test
Наблюдаю, что scope_identity() сохраняет своё значение между батчами в одном коннекте. Как так?

P.S. ничего что я старый топик поднял? вопросы-то смежные.
11 сен 19, 02:21    [21968182]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6498
Gerros,

пробуйте читать не только первую строчку
11 сен 19, 08:54    [21968250]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2985
Gerros
Гавриленко Сергей Алексеевич
Пишем мелкомягкому на пердмет кривой документации? :)
а было бы неплохо... у меня наблюдается явное расхождение с документацией.
SCOPE_IDENTITY (Transact-SQL):
Returns the last identity value inserted into an identity column in the same scope. A scope is a module: a stored procedure, trigger, function, or batch. Therefore, if two statements are in the same stored procedure, function, or batch, they are in the same scope.
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
Oct 20 2015 15:36:27
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
--create table scope_identity_test( id int identity, q int)
go
select '1. must be Null:', scope_identity()
insert scope_identity_test select 1
go
select '2. must be Null:', scope_identity()
--drop table scope_identity_test
Наблюдаю, что scope_identity() сохраняет своё значение между батчами в одном коннекте. Как так?

P.S. ничего что я старый топик поднял? вопросы-то смежные.


Неплохо бы сделать, чтобы бал надпись не только "Между сообщениями интервал более 1 года.", но и более 5 или 10 или 15 лет
11 сен 19, 12:31    [21968432]     Ответить | Цитировать Сообщить модератору
 Re: Сброс SCOPE_IDENTITY  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2396
Gerros
Гавриленко Сергей Алексеевич
Пишем мелкомягкому на пердмет кривой документации? :)
а было бы неплохо... у меня наблюдается явное расхождение с документацией.
SCOPE_IDENTITY (Transact-SQL):
Returns the last identity value inserted into an identity column in the same scope. A scope is a module: a stored procedure, trigger, function, or batch. Therefore, if two statements are in the same stored procedure, function, or batch, they are in the same scope.
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
Oct 20 2015 15:36:27
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
--create table scope_identity_test( id int identity, q int)
go
select '1. must be Null:', scope_identity()
insert scope_identity_test select 1
go
select '2. must be Null:', scope_identity()
--drop table scope_identity_test
Наблюдаю, что scope_identity() сохраняет своё значение между батчами в одном коннекте. Как так?

P.S. ничего что я старый топик поднял? вопросы-то смежные.


Все уже давно перешли на output, а вы все мучаете 20 летний труп.
11 сен 19, 15:08    [21968595]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить