Вызов хранимой процедуры SQL C # - PullRequest
9 голосов
/ 30 января 2010

Как вызвать хранимые процедуры оптом? Я хотел бы сделать что-то вроде массового копирования.

Все, что делает хранимая процедура, это 8 выборок для уникального ограничения и 8 вставок. Без возвращаемого значения.

Ответы [ 5 ]

7 голосов
/ 30 января 2010

Вы не можете сделать это.

Массовое копирование - это аварийный дамп данных в таблицу, вы не можете вызывать sprocs или что-либо еще вместо того, чтобы просто сбросить их в существующую таблицу.

Однако вы можете сделать дамп данных, используя массовое копирование, во временную таблицу с правильной структурой, а затем вызвать ваш sproc, который перемещает эти данные в реальные таблицы, возможно, путем изменения существующих данных вместо их вставки. или еще много чего.

4 голосов
/ 25 февраля 2011

Если вы используете SQL Server 2008, тогда Табличные параметры является приемлемым вариантом.

Сначала вы создаете определяемый пользователем тип таблицы , содержащий все ожидаемые столбцы и типы данных на стороне SQL Server:

create type dbo.MyTableType as table
( 
    foo int,
    bar varchar(100)
);

, затем используйте вышеуказанное в качестве параметра типа таблицы для вашей хранимой процедуры:

create procedure uspInsertMyBulkData
(
    @myTable dbo.MyTableType readonly
)
as
    /* now in here you can use the multi-row data from the passed-in table 
       parameter, @myTable, to do your selects and inserts*/       

Затем на стороне клиента C # / .NET вызовите эту хранимую процедуру через ADO.NET и передайте либо DataTable, либо объект, который наследуется от DbDataReader (например, DataTableReader), либо объект типа IEnumerable<SqlDataRecord>:

// create my source DataTable
object [] row1 = {1, "a"};
object [] row2 = {2, "b"};
var myDataTable = new DataTable();
myDataTable.Columns.Add(new DataColumn("foo"));
myDataTable.Columns.Add(new DataColumn("bar"));
myDataTable.LoadDataRow(row1, true);
myDataTable.LoadDataRow(row2, true);

// bulk send data to database
var conn = new SqlConnection(connectionString);
var cmd = new SqlCommand("uspInsertMyBulkData", conn)
    {
        CommandType = CommandType.StoredProcedure
    };
SqlParameter param = cmd.Parameters.AddWithValue("@myTable", myDataTable);
param.SqlDbType = SqlDbType.Structured;
cmd.ExecuteNonQuery();
1 голос
/ 30 января 2010

Если вы хотите выполнить массовую загрузку данных в таблицу (вставки), класс SqlBulkCopy - это путь.

В качестве альтернативы вы можете использовать SqlDataAdapter .Установите InsertCommand для хранимой процедуры, которая будет выполнять вставку, и сопоставьте поля данных с параметрами sproc.Если вы обновили записи в таблице данных, вы также можете указать UpdateCommand , который будет запускаться для каждой обновленной строки.Затем вызовите метод Update в SqlDataAdapter, передав ему объект данных.Вы можете установить свойство UpdateBatchSize , чтобы определить, сколько записей отправлять в базу данных в каждой передаче туда и обратно.

0 голосов
/ 26 февраля 2011

Я не говорю, что рекомендую это, но вы можете поместить триггер вставки в таблицу, в которую вы массово копируете, которая вставляет в эти 8 отдельных таблиц вместо исходной. Возможно, вам понадобится достаточно большой файл tempdb для хранения всех данных ...

CREATE TRIGGER TRG_REPLACETRIGGER
    ON BULK_TABLE
    INSTEAD OF INSERT
AS BEGIN
    INSERT TABLE1 (ID, VALUE) SELECT ID, VALUE1 FROM INSERTED
    INSERT TABLE2 (ID, VALUE) SELECT ID, VALUE2 FROM INSERTED
    -- ... TABLE3-7
    INSERT TABLE8 (ID, VALUE) SELECT ID, VALUE8 FROM INSERTED
END
0 голосов
/ 30 января 2010

Хранимые процедуры SqlServer могут принимать xml, поэтому вы можете подготовить ваши объемные данные в виде xml-файла и передать их в хранимую процедуру специального назначения, которая затем будет вызывать вашу оригинальную хранимую процедуру для каждой строки. Вам понадобится функция OPENXML .

Я не решаюсь порекомендовать функции XML SqlServer, но это может быть в случае, если они уместны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...