У меня сложилось впечатление, что вы пытаетесь перейти от трех поездок туда-сюда, например:
INSERT => SELECT to get key => OTHER INSERT using previous key
до двух
INSERT returns the key => OTHER INSERT using previous key
Мы можем сделать лучше.
Одним из способов решения этой проблемы является отправка более чем одной команды в строке sql из C #.Таким образом, в итоге получается нечто подобное, что позволяет избежать лишних циклических обращений к базе данных:
string sql = @"
DECLARE @ID int;
EXEC InsertProcedure;
SELECT @ID = scope_identity();
INSERT INTO OtherTable VALUES (@ID);";
using (var cn = new SqlConnection("connection string"))
using (var cmd = new SqlCommand(sql, cn))
{
cn.Open();
cmd.ExecuteNonQuery();
}
В качестве альтернативы, возможно, вам просто нужен ключ для использования в вашем приложении, поэтому вы можете продолжитьработать с записью и быстро искать через это новое значение кластерного индекса.В этом случае вы все равно можете сделать это следующим образом:
string sql = @"
DECLARE @ID int;
EXEC InsertProcedure;
SELECT scope_identity();";
using (var cn = new SqlConnection("connection string"))
using (var cmd = new SqlCommand(sql, cn))
{
cn.Open();
return (int)cmd.ExecuteScalar();
}
Просто будьте осторожны, если у хранимой процедуры есть какие-либо собственные неразрешенные запросы выбора, в этом случае вам нужно будет использовать ExecuteReader()
,наряду с его NextResult()
методом для продвижения между SELECT
результатами запроса.
Конечно, скорее всего, в этом есть нечто большее, чем в вашем реальном коде, где вам нужны параметры для вставки новых данных, но этообеспечивает общую концепцию.