0

我有一个视图,它生成许多列,我想将它们批量加载到另一个具有相同名称列的表中。

当我循环遍历 SqlDataReader 并每次使用 SqlCommand 使用 SqlParameters 进行插入时,此过程运行良好。显然,对于许多 100000 行来说,这太慢了。

我切换到使用 SqlBulkCopy,因为视图列名和目标数据库表的列名和类型匹配(因为上述过程有效!),这似乎可行。

但是,在第一条记录上,它失败并出现 InvalidOperationException 说“String 类型的给定值无法转换为指定目标列的 smalldatetime 类型”。第一行中只有一个日期列,其值为 NULL。

该视图仅返回列的子集,但不是所有列的子集都可以为空。

任何帮助,将不胜感激。

4

3 回答 3

3

sqlbulkcopy 不会自动映射同名的列。它假定您的选择将按照在目标表中看到的相同顺序返回列。

因此,如果目标表中有 7 列并且视图返回 5,它将尝试将这 5 列放在目标表的前 5 列中。

SqlBulkCopy 类可以采用列映射的集合。这应该够了吧

于 2009-12-11T10:48:11.600 回答
0

为什么你不只使用单个 sql 语句

INSERT INTO YourTable (Col1, Col2,...) SELECT Col1, Col2, .. FROM YourView

如果视图与表具有相同的列,则可以在YourTable之后删除 (Col1, Col2,...)并将语句更改为

INSERT INTO YourTable SELECT Col1, Col2, .. FROM YourView

但总的来说,指定要插入的列是一种很好的形式。

然后,您还可以将 where 子句应用于YourView中的选择。

于 2009-12-11T10:38:09.960 回答
0

尝试将SET DATEFORMAT设置为正确的连接格式(ymd、dmy、mdy、...),然后重试。如果您有本地化格式的日期而不是与区域设置无关的格式,通常会发生此错误。

至于在一次插入中完成所有操作,不建议这样做,因为这被认为是长时间运行的事务,而不是批量插入操作。

于 2009-12-11T10:41:46.903 回答