Подскажите, в C# есть параметризованный, где можно перечислить списки параметров, а затем за кулисами при передаче параметров произойдет экранирование параметров и все такое.
А есть ли средства, что бы можно было пульнуть коллекцию в такой запрос
INSERT INTO T1 (F1,F2) VALUES (@F1,@F2)
и сгенерировалось бы:
INSERT INTO T1 (F1,F2) VALUES (1,1),(2,2),(3,3)...(n,n) ?
Или подобное делается только ручками?
Можно спустить вставляемые записи в виде Table-Valued Parameter, примерно так:
Создать табличный тип для передаваемого параметра:
CREATE TYPE dbo.CategoryTableType AS TABLE
( CategoryID int, CategoryName nvarchar(50) )
И передать из C# параметр в виде DataTable, IEnumerable<SqlDataRecord>, или DbDataReader:
string sqlInsert = @"INSERT INTO dbo.Categories (CategoryID, CategoryName)
SELECT nc.CategoryID, nc.CategoryName FROM @tvpNewCategories AS nc";
SqlCommand insertCommand = new SqlCommand(sqlInsert, connection);
SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@tvpNewCategories", addedCategories);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.CategoryTableType";
Полный пример есть в MSDN: Table-Valued Parameters
Если данных много (больше 1000 строк) - лучше вставлять данные через запихнуть через bulk insert, вызовом SqlBulkCopy.WriteToServer.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости