我试着写一个程序来执行大表,大约20亿条记录,到另一个表。在我看来,在插入之前,SqlBulkCopy需要等待,直到从SqlDataReader读取完所有数据。如果我在SSIS中使用相同的查询和表,SSIS会立即启动,并且我可以看到从目标表插入数据。
我的编码正确吗?我怎么才能让它和SSIS一样呢?
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(bukCopyData.SourceQuery, conn))
{
cmd.CommandTimeout = 0;
using (SqlDataReader reader = cmd.ExecuteReader())
{
performBulkCopy(connectionStringDest, DestinationTable, reader);
}
}
} private void performBulkCopy(string connectionString, string destinationTable, SqlDataReader reader)
{
using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString,
SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.KeepNulls
))
{
sbc.DestinationTableName = destinationTable;
sbc.BatchSize = 102400;
sbc.BulkCopyTimeout = 0;
try
{
sbc.WriteToServer(reader);
} catch (Exception e)
{
throw;
} finally
{
reader.Close();
}
}
}
}发布于 2020-05-16 02:02:56
实际上,EnableStreaming属性似乎起作用了。我必须确保查询中的列顺序与目标表匹配。不确定为什么需要很长时间才能抛出错误。
https://stackoverflow.com/questions/61824997
复制相似问题