如何批量调用存储过程?我想做一些像批量复制这样的事情。
存储过程所做的全部工作就是8次唯一约束选择和8次插入。没有返回值的。
发布于 2010-01-30 06:27:08
你不能这么做。
海量复制是将数据强制转储到表中,您不能调用sprocs或其他任何东西,而只是将其转储到现有表中。
但是,您可以做的是使用大容量复制将数据转储到具有正确结构的临时表中,然后调用sproc将数据移动到真实表中,可能是通过修改现有数据而不是插入数据或诸如此类的方式。
发布于 2011-02-26 02:25:42
如果您使用的是SQL Server2008,那么Table-Valued Parameters是一个可行的选择。
首先,在SQL Server端创建一个包含所有预期列和数据类型的user-defined table type:
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();发布于 2010-01-30 06:30:53
如果要将数据大容量加载到表中(插入),则可以使用SqlBulkCopy类。
或者,您可以使用SqlDataAdapter。将InsertCommand设置为将执行插入的存储过程,并将datatable字段映射到存储过程参数。如果您已经更新了数据表中的记录,您还可以指定一个UpdateCommand,它将为每个更新的行触发。然后在SqlDataAdapter上调用Update方法,并将其传递给datatable。可以设置UpdateBatchSize属性来定义在每个往返过程中要发送到数据库的记录数。
https://stackoverflow.com/questions/2165615
复制相似问题