SQL批量存储过程调用C#

Wil*_*ill 9 .net c# sql bulkinsert

如何批量调用存储过程?我想做一些像批量复制的东西.

存储过程所做的全部是8选择唯一约束和8个插入.没有回报价值.

ang*_*son 7

你不能这样做.

批量复制是一个firehose数据转储到表中,您不能调用sprocs或其他任何东西,而不是只是将其转储到现有的表中.

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


Ray*_*ega 5

如果您使用的是 SQL Server 2008,那么表值参数是一个可行的选择。

首先,创建一个用户定义的表类型,其中包含 SQL Server 端的所有预期列和数据类型:

create type dbo.MyTableType as table
( 
    foo int,
    bar varchar(100)
);
Run Code Online (Sandbox Code Playgroud)

然后将上述内容用作存储过程的表类型参数:

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*/       
Run Code Online (Sandbox Code Playgroud)

然后,在 C#/.NET 客户端,通过 ADO.NET 调用此存储过程并传入 、DataTableDbDataReader(例如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();
Run Code Online (Sandbox Code Playgroud)