首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL大容量存储过程调用C#

SQL大容量存储过程调用C#
EN

Stack Overflow用户
提问于 2010-01-30 06:24:53
回答 5查看 13.3K关注 0票数 9

如何批量调用存储过程?我想做一些像批量复制这样的事情。

存储过程所做的全部工作就是8次唯一约束选择和8次插入。没有返回值的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-30 06:27:08

你不能这么做。

海量复制是将数据强制转储到表中,您不能调用sprocs或其他任何东西,而只是将其转储到现有表中。

但是,您可以做的是使用大容量复制将数据转储到具有正确结构的临时表中,然后调用sproc将数据移动到真实表中,可能是通过修改现有数据而不是插入数据或诸如此类的方式。

票数 7
EN

Stack Overflow用户

发布于 2011-02-26 02:25:42

如果您使用的是SQL Server2008,那么Table-Valued Parameters是一个可行的选择。

首先,在SQL Server端创建一个包含所有预期列和数据类型的user-defined table type

代码语言:javascript
复制
create type dbo.MyTableType as table
( 
    foo int,
    bar varchar(100)
);

然后使用上面的内容作为存储过程的表类型参数:

代码语言:javascript
复制
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>类型的对象:

代码语言:javascript
复制
// 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();
票数 5
EN

Stack Overflow用户

发布于 2010-01-30 06:30:53

如果要将数据大容量加载到表中(插入),则可以使用SqlBulkCopy类。

或者,您可以使用SqlDataAdapter。将InsertCommand设置为将执行插入的存储过程,并将datatable字段映射到存储过程参数。如果您已经更新了数据表中的记录,您还可以指定一个UpdateCommand,它将为每个更新的行触发。然后在SqlDataAdapter上调用Update方法,并将其传递给datatable。可以设置UpdateBatchSize属性来定义在每个往返过程中要发送到数据库的记录数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2165615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档