SQL: Как получить идентификатор значений, которые я только что вставил? - PullRequest
75 голосов
/ 05 сентября 2008

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

Можете ли вы сказать мне, как это сделать правильно?

Ответы [ 21 ]

2 голосов
/ 17 августа 2012

Ms SQL Server: это хорошее решение, даже если вы добавляете больше строк:

 Declare @tblInsertedId table (Id int not null)

 INSERT INTO Test ([Title], [Text])
 OUTPUT inserted.Id INTO @tblInsertedId (Id)
 SELECT [Title], [Text] FROM AnotherTable

 select Id from @tblInsertedId 
2 голосов
/ 01 июля 2010
sql = "INSERT INTO MyTable (Name) VALUES (@Name);" +
      "SELECT CAST(scope_identity() AS int)";
SqlCommand cmd = new SqlCommand(sql, conn);
int newId = (int)cmd.ExecuteScalar();
2 голосов
/ 05 сентября 2008

Какую базу данных вы используете? Насколько я знаю, для этого не существует независимого от базы данных метода.

2 голосов
/ 05 сентября 2008

Вот как я это сделал, используя параметризованные команды.

MSSQL

 INSERT INTO MyTable (Field1, Field2) VALUES (@Value1, @Value2); 
 SELECT SCOPE_IDENTITY(); 

MySQL

 INSERT INTO MyTable (Field1, Field2) VALUES (?Value1, ?Value2);
 SELECT LAST_INSERT_ID();
2 голосов
/ 05 сентября 2008

Помните, что @@ IDENTITY возвращает последний созданный идентификатор для вашего текущего соединения, а не обязательно идентификатор для недавно добавленной строки в таблице. Вы всегда должны использовать SCOPE_IDENTITY () для возврата идентификатора недавно добавленной строки.

1 голос
/ 05 сентября 2008

Ответ Роба был бы наиболее независимым от поставщика, но если вы используете MySQL , более безопасный и правильный выбор будет встроенной функцией LAST_INSERT_ID().

0 голосов
/ 23 ноября 2008

Решение Oracle на основе среды:

CREATE OR REPLACE PACKAGE LAST
AS
ID NUMBER;
FUNCTION IDENT RETURN NUMBER;
END;
/

CREATE OR REPLACE PACKAGE BODY LAST
AS
FUNCTION IDENT RETURN NUMBER IS
    BEGIN
    RETURN ID;
    END;
END;
/


CREATE TABLE Test (
       TestID            INTEGER ,
    Field1      int,
    Field2      int
)


CREATE SEQUENCE Test_seq
/
CREATE OR REPLACE TRIGGER Test_itrig
BEFORE INSERT ON Test
FOR EACH ROW
DECLARE
seq_val number;
BEGIN
IF :new.TestID IS NULL THEN
    SELECT Test_seq.nextval INTO seq_val FROM DUAL;
    :new.TestID := seq_val;
    Last.ID := seq_val;
END IF;
END;
/

To get next identity value:
SELECT LAST.IDENT FROM DUAL
0 голосов
/ 16 сентября 2008
  1. вставить строку с известной направляющей.
  2. получить autoId-поле с этим guid.

Это должно работать с любой базой данных.

0 голосов
/ 08 мая 2013

В TransactSQL для этого можно использовать предложение OUTPUT.

INSERT INTO my_table(col1,col2,col3) OUTPUT INSERTED.id VALUES('col1Value','col2Value','col3Value')

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

0 голосов
/ 09 июня 2014

Самый простой ответ:

command.ExecuteScalar()

по умолчанию возвращает первый столбец

Возвращаемое значение Тип: System.Object Первый столбец первой строки в наборе результатов или нулевая ссылка (Nothing в Visual Basic), если набор результатов пуст. Возвращает максимум 2033 символа.

Скопировано с MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...