Возвращаемое значение из команды SQL Server Insert с использованием С#

Используя С# в Visual Studio, я вставляю строку в таблицу следующим образом:

INSERT INTO foo (column_name)
VALUES ('bar')

Я хочу сделать что-то подобное, но я не знаю правильного синтаксиса:

INSERT INTO foo (column_name)
VALUES ('bar')
RETURNING foo_id

Это вернет столбец foo_id из недавно вставленной строки.

Кроме того, даже если я нахожу правильный синтаксис для этого, у меня есть другая проблема: у меня есть SqlDataReader и SqlDataAdapter в моем распоряжении. Насколько мне известно, первая предназначена для чтения данных, вторая предназначена для манипулирования данными. При вставке строки с оператором return я обрабатываю и считываю данные, поэтому я не уверен, что использовать. Может быть, есть что-то совершенно другое, что я должен использовать для этого?

Ответ 1

SCOPE_IDENTITY возвращает последнее значение идентичности, вставленное в столбец идентификатора в той же области. Объем - это модуль: хранимая процедура, триггер, функция или партия. Поэтому два оператора находятся в одной и той же области, если они находятся в одной и той же хранимой процедуре, функции или партии.

Вы можете использовать SqlCommand.ExecuteScalar для выполнения команды insert и получения нового идентификатора в одном запросе.

using (var con = new SqlConnection(ConnectionString)) {
    int newID;
    var cmd = "INSERT INTO foo (column_name)VALUES (@Value);SELECT CAST(scope_identity() AS int)";
    using (var insertCommand = new SqlCommand(cmd, con)) {
        insertCommand.Parameters.AddWithValue("@Value", "bar");
        con.Open();
        newID = (int)insertCommand.ExecuteScalar();
    }
}

Ответ 2

попробуйте следующее:

INSERT INTO foo (column_name)
OUTPUT INSERTED.column_name,column_name,...
VALUES ('bar')

OUTPUT может возвращать набор результатов (среди прочего), см. Предложение OUTPUT (Transact-SQL). Кроме того, если вы вставляете несколько значений (INSERT SELECT), этот метод возвращает одну строку на вставленную строку, где другие методы возвращают только информацию в последней строке.

рабочий пример:

declare @YourTable table (YourID int identity(1,1), YourCol1 varchar(5))

INSERT INTO @YourTable (YourCol1)
OUTPUT INSERTED.YourID
VALUES ('Bar')

ВЫВОД:

YourID
-----------
1

(1 row(s) affected)

Ответ 3

Я думаю, вы можете использовать @@IDENTITY для этого, но я думаю, что вокруг него есть специальные правила/ограничения?

using (var con = new SqlConnection("connection string"))
{
    con.Open();
    string query = "INSERT INTO table (column) VALUES (@value)";

    var command = new SqlCommand(query, con);
    command.Parameters.Add("@value", value);
    command.ExecuteNonQuery();

    command.Parameters.Clear();
    command.CommandText = "SELECT @@IDENTITY";

    int identity = Convert.ToInt32(command.ExecuteScalar());
}