параметризованный INSERT N записей

213
01 марта 2018, 09:55

Подскажите, в C# есть параметризованный, где можно перечислить списки параметров, а затем за кулисами при передаче параметров произойдет экранирование параметров и все такое.

А есть ли средства, что бы можно было пульнуть коллекцию в такой запрос

INSERT INTO T1 (F1,F2) VALUES (@F1,@F2)

и сгенерировалось бы: INSERT INTO T1 (F1,F2) VALUES (1,1),(2,2),(3,3)...(n,n) ?

Или подобное делается только ручками?

Answer 1

Можно спустить вставляемые записи в виде 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.

READ ALSO
Работа с двумерным массивом &ldquo;Морской бой&rdquo; [требует правки]

Работа с двумерным массивом “Морской бой” [требует правки]

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

246
NodeJs Как правильно настроить роутинг

NodeJs Как правильно настроить роутинг

Хочу, чтобы в адресной строке, отображалось название страницы на которой нахожусьПрочитал кучу всего, но увы, node js мне пока не подается

263
Как отправить и получить данные в vue-resource?

Как отправить и получить данные в vue-resource?

Собственно для отправки делаю так:

250