Обработка нескольких обновлений БД из С# в SQL Server 2008

Мне нравится находить способ обрабатывать несколько обновлений базы данных sql (с одним обходом базы данных). Я читал о табличных параметрах в SQL Server 2008 http://www.codeproject.com/KB/database/TableValueParameters.aspx, который кажется действительно полезным. Но, похоже, мне нужно создать как хранимую процедуру, так и тип таблицы, чтобы использовать ее. Это правда? Может из-за безопасности? Я хотел бы запустить текстовый запрос просто так:

var sql = "INSERT INTO Note (UserId, note) SELECT * FROM @myDataTable";
var myDataTable = ... some System.Data.DataTable ...
var cmd = new System.Data.SqlClient.SqlCommand(sql, conn);
var param = cmd.Parameters.Add("@myDataTable", System.Data.SqlDbType.Structured);
param.Value=myDataTable;
cmd.ExecuteNonQuery();

So

А) нужно ли мне создавать как хранимую процедуру, так и тип таблицы, чтобы использовать TVP? и
B) какой альтернативный метод рекомендуется для отправки нескольких обновлений (и вставок) в SQL Server?


person joeriks    schedule 25.09.2011    source источник
comment
А) Да. Б) Альтернативы: XML, строки [n]varchar(size) + парсинг. Мой вариант - ТВП.   -  person Bogdan Sahlean    schedule 25.09.2011
comment
хорошо, спасибо и вам :)   -  person joeriks    schedule 25.09.2011
comment
В какой момент это не стоит усилий, чтобы избежать пары поездок в БД?   -  person JeffO    schedule 26.09.2011
comment
Джефф – Я хотел бы узнать, сколько это стоит (еще один вопрос?). На данный момент это догадка +, что более важно, практика, которая, по-видимому, общепризнана, от MS P&P Круговые поездки значительно влияют на производительность. Они подвержены задержке сети и задержке нижестоящего сервера. Многие управляемые данными веб-сайты интенсивно обращаются к базе данных по каждому запросу пользователя. Хотя пул соединений помогает, увеличение сетевого трафика и вычислительной нагрузки на сервере базы данных может отрицательно сказаться на производительности. Сведите поездки туда и обратно к абсолютному минимуму. msdn.microsoft.com/en-us/library/ff647768.aspx   -  person joeriks    schedule 26.09.2011


Ответы (1)


Да, вам нужно создать типы.

Альтернативой является отправка большого пакета строк sql или передача XML в sprocs.

Недостатком больших пакетов строк sql является то, что он может сжечь кеш sql proc и вызвать перекомпиляцию sql, особенно если пакет уникален из-за того, что входные данные являются частью этой большой строки. По определению каждая партия будет уникальной.

XML был основной альтернативой до TVP. Единственный недостаток XML, по крайней мере некоторое время, sql azure не поддерживал его (это может измениться?), поэтому он ограничивает ваши возможности.

TVP, кажется, способ сделать это. Наш проект только что перешел на использование TVP.

Надеюсь, это поможет.

person bryanmac    schedule 25.09.2011
comment
Хорошо, большое спасибо. Вот почему я люблю СО. Опыт реального мира ответит в течение 1 часа после моего вопроса. Я сделал свой тип таблицы и sproc, и теперь несколько обновлений - это ветерок. - person joeriks; 25.09.2011