powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тест для знатоков MS SQL
14 сообщений из 14, страница 1 из 1
Тест для знатоков MS SQL
    #39984658
mikka sikorsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Мой знакомый прислал мне тест, на который хочет получить ответ.
А я что-то растерялся, как ответить, т.к. не сталкивался ранее с подобной задачей.
Погуглил, пишут, что может причиной быть триггер, например, который делает вставку в какую-либо таблицу.
А как решить вопрос? Либо не использовать @@identity? либо отключить триггер?

В таблице A (столбец id – integer identity primary key) было три строки. Мы выполнили следующий скрипт:
Код: sql
1.
2.
3.
4.
5.
6.
 
insert A(name) values('DDD')
print @@identity
insert A(name) values('EEE')
print @@identity
go


Результат, выводимый скриптом:
4
2

Чем может быть вызван этот неожиданный результат?
Как добиться правильного результата (=5) во втором случае?

Состояние таблицы A:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
до вставки	 	после вставки
 
id	name		id	name
1	AAA	 	1	AAA
2	BBB	 	2	BBB
3	CCC	 	3	CCC
 	 	 	4	DDD
 	 	 	5	EEE
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39984659
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@@identity использовать не надо, а надо или output использовать, или, на худой конец, scope_identity()
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39984664
mikka sikorsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

Спасибо за ответ.
Это понятно, я про это нагуглил.
Интересует причина сложившейся ситуации, как в примере, и как её решить?
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39984665
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikka sikorsky
Интересует причина сложившейся ситуации, как в примере
Причина описана в документации для @@identity
mikka sikorsky, и как её решить?Написал же - не использовать @@identity
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39984666
mikka sikorsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

Вы пропустили вопрос:

mikka sikorsky
Чем может быть вызван этот неожиданный результат?
Как добиться правильного результата (=5) во втором случае?

Я же тоже написал, что про @@identity понятно.
Предполагаю, что нужно дать выполниться именно последовательной вставке в таблицу, чтобы никакой другой insert не отработал, т.к. @@identity распространяется на всю сессию
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39984671
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikka sikorsky
Вы пропустили вопрос:

mikka sikorsky
Чем может быть вызван этот неожиданный результат?
Как добиться правильного результата (=5) во втором случае?


Вам же ответили


Q: Чем может быть вызван этот неожиданный результат?
A: Триггером на вставку в другую таблицу с identity

Q: Как добиться правильного результата (=5) во втором случае?
A: Вместо @@identity использовать output или scope_identity()
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39984702
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
mikka sikorsky
Вы пропустили вопрос:

пропущено...


Вам же ответили


Q: Чем может быть вызван этот неожиданный результат?
A: Триггером на вставку в другую таблицу с identity

Q: Как добиться правильного результата (=5) во втором случае?
A: Вместо @@identity использовать output или scope_identity()
А у таблицы A есть триггер INSTEAD OF INSERT! :))
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39984712
mikka sikorsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё-таки, я склоняюсь к несколько другому ответу.
В BOL написано следующее:

Областью функции @@IDENTITY является текущий сеанс на локальном сервере, на котором она выполняется.

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

В условии про триггер не сказано, поэтому, если он есть, то его нужно отключить. Кроме того, вставку в таблицу А нужно осуществлять, убедившись, что репликация не запущена
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39984714
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikka sikorsky
В условии про триггер не сказано, поэтому, если он есть, то его нужно отключить. Кроме того, вставку в таблицу А нужно осуществлять, убедившись, что репликация не запущена
Какой же бред. Это примерно как убрать забор, который мешает свалиться со скалы чтобы таки с нее свалиться.
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39984720
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikka sikorsky,

авторВ условии про триггер не сказано, поэтому, если он есть, то его нужно отключить.
Это неверное решение В случае обнаружения противоречия задания для устранения противоречия необходимо задать вопрос постановщику задачи.
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39984802
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikka sikorsky

В условии про триггер не сказано, поэтому, если он есть, то его нужно отключить. Кроме того, вставку в таблицу А нужно осуществлять, убедившись, что репликация не запущена


О! Точно! В условии еще не написано, что это все происходит на Оракле, так что надо сначала переписать на оракл запрос, потом отключить триггер и уже далее по тексту.

Хотя если там забыли добавить, что это происходит на военной базе и доступа туда ни физического ни удаленного нет, то print @@identity выводящий 4 после 2 - это нормально - генерал разрешил.
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39986009
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msLex
mikka sikorsky
Вы пропустили вопрос:

пропущено...


Вам же ответили

Q: Как добиться правильного результата (=5) во втором случае?
A: Вместо @@identity использовать output или scope_identity()

Интересно, как по вашему здесь поможет output?
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39986026
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Интересно, как по вашему здесь поможет output?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare
  @t1 table (
    id int identity
  );
declare
  @t2 table (
    id int
  );
insert into @t1 output inserted.id into @t2 default values;
insert into @t1 output inserted.id into @t2 default values;
insert into @t1 output inserted.id into @t2 default values;
select id from @t2;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

id
-----------
1
2
3

(3 row(s) affected)
...
Рейтинг: 0 / 0
Тест для знатоков MS SQL
    #39986032
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, все, понял где протупил!
Сейчас смотрел, и не мог понять, почему при вставке в master - detail уже привычно использую merge on 1=0 + output, а не insert into + output, для того, чтобы получить в output связку новый ключ-старый ключ.
В голове отложилось, "из-за того, что не получить ключ".
Только не новый ключ, а старый ключ, который в inserted не доступен, если не вставляется в целевую таблицу. И поля исходной таблицы тоже недоступны в output в случае insert.

Вот что имелось ввиду: https://stackoverflow.com/questions/27488744/copy-multiple-records-with-a-master-details-relationship

Как у меня при этом родилось и закрепилось "identity не получить в output" - это хотелось бы понять дополнительно.
Но, боюсь, это в другой форум. Медицинский.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тест для знатоков MS SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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