kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 melbic
melbic
Вопрос

SQL Server - Возвращаемое значение после INSERT

Я пытаюсь получить ключ-значение обратно после INSERT-заявления. Пример: У меня есть таблица с атрибутами name и id. id - это сгенерированное значение.

    INSERT INTO table (name) VALUES('bob');

Теперь я хочу получить id обратно в том же шаге. Как это делается?

Мы используем Microsoft SQL Server 2008.

278 2011-10-27T14:46:40+00:00 13
Программирование
sql
sql-server
sql-server-2008
Решение / Ответ
 gbn
gbn
27-го октября 2011 в 2:57
2011-10-27T14:57:18+00:00
Дополнительно
Источник
Редактировать
#13685180

Нет необходимости в отдельном выберите...

INSERT INTO table (name)
OUTPUT Inserted.ID
VALUES('bob');

Это работает для не-идентичности столбцов (например GUID) тоже

439
0
 Curt
Curt
27-го октября 2011 в 2:48
2011-10-27T14:48:10+00:00
Дополнительно
Источник
Редактировать
#13685177

Используйте SCOPE_IDENTITY() для получения нового значения ID

INSERT INTO table (name) VALUES('bob');

SELECT SCOPE_IDENTITY()

http://msdn.microsoft.com/en-us/library/ms190315.aspx

174
0
 hajikelist
hajikelist
24-го июня 2015 в 9:25
2015-06-24T21:25:51+00:00
Дополнительно
Источник
Редактировать
#13685181
INSERT INTO files (title) VALUES ('whatever'); 
SELECT * FROM files WHERE id = SCOPE_IDENTITY();

Самая безопасная ставка, так как есть известная проблема с пунктом вывода конфликта на таблицы с триггерами. Делает это достаточно ненадежный, поскольку даже если ваш стол не'В настоящее время Т есть какие-либо триггеры - кто-то добавляет одну линию сломать ваше приложение. Время вроде бомбы поведения.

См. В статье MSDN для более глубокого объяснения:

http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx

António Almeida
António Almeida
Редактировал ответ 5-го ноября 2015 в 5:56
42
0
Ian Boyd
Ian Boyd
3-го ноября 2016 в 9:36
2016-11-03T21:36:35+00:00
Дополнительно
Источник
Редактировать
#13685184

Рамках субъект выполняет что-то похожее на ГБН'ы ответа:

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO Customers(FirstName)
OUTPUT inserted.CustomerID INTO @generated_keys
VALUES('bob');

SELECT t.[CustomerID]
FROM @generated_keys AS g 
   JOIN dbo.Customers AS t 
   ON g.Id = t.CustomerID
WHERE @@ROWCOUNT > 0

Выходные результаты сохраняются во временной таблице переменных, а потом выбираться обратно клиенту. Должны быть в курсе попалась:

вставки могут составлять более чем одну строку, так что переменная может содержать более одной строки, так что вы можете быть возвращено более одного идентификатор

Я понятия не имею, почему эф бы внутреннее соединение эфемерное в реальной таблице (при каких обстоятельствах бы не матч).

Но, что's что ФВ делает.

В SQL Server 2008 или новее только. Если это's 2005 года, затем вы'вновь повезло.

Ian Boyd
Ian Boyd
Редактировал ответ 4-го ноября 2016 в 3:04
26
0
 AngelaG
AngelaG
12-го октября 2017 в 11:48
2017-10-12T11:48:01+00:00
Дополнительно
Источник
Редактировать
#13685185

`Функция@@Identity-это системная функция, которая возвращает последнее значение идентификатора, вставленное.

Dale K
Dale K
Редактировал ответ 15-го сентября 2019 в 10:27
9
0
 Purplegoldfish
Purplegoldfish
27-го октября 2011 в 2:50
2011-10-27T14:50:21+00:00
Дополнительно
Источник
Редактировать
#13685179

Вы можете использовать scope_identity() для выбора идентификатора строки, которую вы только что вставили в переменную, а затем просто выбрать любые столбцы из этой таблицы, где id = идентификатору, который вы получили из scope_identity().

Смотрите здесь информацию MSDN http://msdn.microsoft.com/en-us/library/ms190315.aspx

Dale K
Dale K
Редактировал ответ 15-го сентября 2019 в 10:31
4
0
 MNF
MNF
17-го октября 2018 в 1:27
2018-10-17T13:27:04+00:00
Дополнительно
Источник
Редактировать
#13685187

Лучшим и наиболее надежным решением является использование функции scope_identity()`.

Просто вы должны сделать сферу личности после каждого Insert и сохранить его в переменной, так можно назвать две вставки в той же области.

функция ident_current и `функция@@Identity может быть они работают, но они не являются безопасными области. Вы можете иметь проблемы в большом приложении

  declare @duplicataId int
  select @duplicataId =   (SELECT SCOPE_IDENTITY())

Более подробно здесь Майкрософт документации

Dale K
Dale K
Редактировал ответ 15-го сентября 2019 в 10:27
4
0
Reza Jenabi
Reza Jenabi
11-го ноября 2019 в 8:53
2019-11-11T08:53:45+00:00
Дополнительно
Источник
Редактировать
#13685189

Есть много способов, чтобы выйти после вставки

при вставке данных в таблицу, вы можете использовать предложение output возвращает копию данных, которые были вставлены в таблицу. В В предложении output принимает две основные формы: выход и вывод. Используйте форма выпуска Если вы хотите возврата данных вызывающему приложению. использовать выходные данные в форме, если вы хотите вернуть данные в таблице или переменная таблица.

DECLARE @MyTableVar TABLE (id INT,NAME NVARCHAR(50));

INSERT INTO tableName
(
  NAME,....
)OUTPUT INSERTED.id,INSERTED.Name INTO @MyTableVar
VALUES
(
   'test',...
)

Функция ident_current: он возвращает последний стиль, созданный для конкретной таблицы или представления в любой сессии.

SELECT IDENT_CURRENT('tableName') AS [IDENT_CURRENT]

Функция scope_identity: он возвращает последний тож из той же сессии, и той же области. Объем хранимых процедур/триггеров и т. д.

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  

@@Личность: он возвращает последний тож из той же сессии.

SELECT @@IDENTITY AS [@@IDENTITY];
0
0
Richard Zembron
Richard Zembron
27-го февраля 2016 в 12:22
2016-02-27T12:22:39+00:00
Дополнительно
Источник
Редактировать
#13685183

Это, как я использую выход вставить, при вставке в таблицу, которая использует ID в столбец идентификаторов в SQL сервере:

'myConn is the ADO connection, RS a recordset and ID an integer
Set RS=myConn.Execute("INSERT INTO M2_VOTELIST(PRODUCER_ID,TITLE,TIMEU) OUTPUT INSERTED.ID VALUES ('Gator','Test',GETDATE())")
ID=RS(0)
0
0
Robert Quinn
Robert Quinn
7-го января 2018 в 6:24
2018-01-07T06:24:55+00:00
Дополнительно
Источник
Редактировать
#13685186

Вы можете добавить Select для вашего оператора Insert. Целое число Мьинт = Вставить в таблицу table1 (имени) значения('Фред'); выберите функции scope_identity(); Это вернет значение личности при выполнении скалер.

Robert Quinn
Robert Quinn
Редактировал ответ 7-го января 2018 в 6:37
0
0
David Guidos
David Guidos
5-го августа 2015 в 9:34
2015-08-05T21:34:53+00:00
Дополнительно
Источник
Редактировать
#13685182

Порядок параметров в строке подключения-это иногда важно. Поставщик параметра'ы местонахождение можно разбить записей курсор после добавления строки. Мы видели такое поведение с поставщика sqloledb.

После добавления строки, поля строк не доступен, если поставщик указан как первый параметр в строке подключения. Когда поставщик находится в любом месте в строке подключения, кроме как первый параметр, недавно вставленные поля строк не доступен. Когда мы переехали поставщика первого параметра, строки волшебным образом появились поля.

-3
0
 Sparky
Sparky
4-го января 2019 в 6:40
2019-01-04T18:40:54+00:00
Дополнительно
Источник
Редактировать
#13685188

Это может быть немного старомодно, но есть много людей, использующих старые версии PHP, до 5.5 если быть более точным. Более подробную информацию можно найти на http://php.net/manual/en/function.mysql-insert-id.php

$last = mysql_insert_id();
-5
0
 FanOfTamago
FanOfTamago
27-го октября 2011 в 2:49
2011-10-27T14:49:08+00:00
Дополнительно
Источник
Редактировать
#13685178

После выполнения вставки в таблицу со столбцом identity вы можете сослаться на @@IDENTITY, чтобы получить значение: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx

-5
0
Похожие сообщества 4
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
3 543 пользователей
Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.
Открыть telegram
sql_ninja
sql_ninja
2 468 пользователей
Канал для тех, кто знает или интересуется SQL 🛢 Взаимная помощь и позитив =) Вакансии тут - @sql_jobs Бан за: оскорбления, спам, фри рекламу, расизм, сексизм. Наш MSSQL канал - @sqlcom По рекламе: @aveLestat
Открыть telegram
SQL JOBS
SQL JOBS
2 025 пользователей
Обязательны: компания, город, позиция, вилка, наличие удалёнки, требования, контакты. Бан за рекламу, сексизм, расизм и неадекватный обсёр объявлений
Открыть telegram
Lazarus : Database (Firebird, mySQL, SQLite, PostgreSQL, ...)
28 пользователей
Базы данных в Lazarus https://t.me/Delphi_Lazarus (по-русски) https://t.me/Delphi_Lazarus_offtop https://t.me/freepascal_en (по-английски) по темам: https://t.me/Lazarus_Database https://t.me/Lazarus_Graphics https://t.me/Lazarus_Android
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Роман Азаров
Зарегистрирован 3 дня назад
2
Mansur Zakirov
Зарегистрирован 6 дней назад
3
Тагир Мамедов
Зарегистрирован 1 неделю назад
4
Алексей Толманов
Зарегистрирован 1 неделю назад
5
Valeriu Vodnicear
Зарегистрирован 2 недели назад
BG
DE
EL
ES
FR
ID
IT
JA
NL
PT
RO
RU
TR
UK
ZH
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией