|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
Добрый день! Мой знакомый прислал мне тест, на который хочет получить ответ. А я что-то растерялся, как ответить, т.к. не сталкивался ранее с подобной задачей. Погуглил, пишут, что может причиной быть триггер, например, который делает вставку в какую-либо таблицу. А как решить вопрос? Либо не использовать @@identity? либо отключить триггер? В таблице A (столбец id – integer identity primary key) было три строки. Мы выполнили следующий скрипт: Код: sql 1. 2. 3. 4. 5. 6.
Результат, выводимый скриптом: 4 2 Чем может быть вызван этот неожиданный результат? Как добиться правильного результата (=5) во втором случае? Состояние таблицы A: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 14:52 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
@@identity использовать не надо, а надо или output использовать, или, на худой конец, scope_identity() ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 14:54 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич, Спасибо за ответ. Это понятно, я про это нагуглил. Интересует причина сложившейся ситуации, как в примере, и как её решить? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:12 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
mikka sikorsky Интересует причина сложившейся ситуации, как в примере mikka sikorsky, и как её решить?Написал же - не использовать @@identity ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:14 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич, Вы пропустили вопрос: mikka sikorsky Чем может быть вызван этот неожиданный результат? Как добиться правильного результата (=5) во втором случае? Я же тоже написал, что про @@identity понятно. Предполагаю, что нужно дать выполниться именно последовательной вставке в таблицу, чтобы никакой другой insert не отработал, т.к. @@identity распространяется на всю сессию ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:22 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
mikka sikorsky Вы пропустили вопрос: mikka sikorsky Чем может быть вызван этот неожиданный результат? Как добиться правильного результата (=5) во втором случае? Вам же ответили Q: Чем может быть вызван этот неожиданный результат? A: Триггером на вставку в другую таблицу с identity Q: Как добиться правильного результата (=5) во втором случае? A: Вместо @@identity использовать output или scope_identity() ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:29 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
msLex mikka sikorsky Вы пропустили вопрос: пропущено... Вам же ответили Q: Чем может быть вызван этот неожиданный результат? A: Триггером на вставку в другую таблицу с identity Q: Как добиться правильного результата (=5) во втором случае? A: Вместо @@identity использовать output или scope_identity() ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 16:37 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
Всё-таки, я склоняюсь к несколько другому ответу. В BOL написано следующее: Областью функции @@IDENTITY является текущий сеанс на локальном сервере, на котором она выполняется. Репликация может затронуть значение системной переменной @@IDENTITY, так как она используется в триггерах и хранимых процедурах репликации. Функция @@IDENTITY не является надежным признаком последнего созданного пользователем идентификатора, если столбец является частью статьи репликации. В условии про триггер не сказано, поэтому, если он есть, то его нужно отключить. Кроме того, вставку в таблицу А нужно осуществлять, убедившись, что репликация не запущена ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 17:37 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
mikka sikorsky В условии про триггер не сказано, поэтому, если он есть, то его нужно отключить. Кроме того, вставку в таблицу А нужно осуществлять, убедившись, что репликация не запущена ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 17:41 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
mikka sikorsky, авторВ условии про триггер не сказано, поэтому, если он есть, то его нужно отключить. Это неверное решение В случае обнаружения противоречия задания для устранения противоречия необходимо задать вопрос постановщику задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 17:55 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
mikka sikorsky В условии про триггер не сказано, поэтому, если он есть, то его нужно отключить. Кроме того, вставку в таблицу А нужно осуществлять, убедившись, что репликация не запущена О! Точно! В условии еще не написано, что это все происходит на Оракле, так что надо сначала переписать на оракл запрос, потом отключить триггер и уже далее по тексту. Хотя если там забыли добавить, что это происходит на военной базе и доступа туда ни физического ни удаленного нет, то print @@identity выводящий 4 после 2 - это нормально - генерал разрешил. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2020, 05:21 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
msLex mikka sikorsky Вы пропустили вопрос: пропущено... Вам же ответили Q: Как добиться правильного результата (=5) во втором случае? A: Вместо @@identity использовать output или scope_identity() Интересно, как по вашему здесь поможет output? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2020, 23:21 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
uaggster Интересно, как по вашему здесь поможет output? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2020, 04:47 |
|
Тест для знатоков MS SQL
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, все, понял где протупил! Сейчас смотрел, и не мог понять, почему при вставке в 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" - это хотелось бы понять дополнительно. Но, боюсь, это в другой форум. Медицинский. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2020, 07:19 |
|
|
start [/forum/topic.php?fid=46&msg=39984659&tid=1685822]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 18ms |
total: | 160ms |
0 / 0 |