我有一个视图,它生成了许多列,我想将它们批量加载到另一个具有相同名称列的表中。
当我循环遍历SqlDataReader并且每次使用SqlCommand使用SqlParameters进行插入时,此过程工作正常。显然,对于许多100000行,这太慢了。
我切换到使用SqlBulkCopy,因为它似乎可以工作,因为视图列名和目标数据库表列名和类型匹配(因为上面的过程有效!)。
但是,在第一个记录上,它失败并出现InvalidOperationException,指出“String类型的给定值无法转换为指定目标列的smalldatetime类型”。第一行中只有一个日期列,其值为NULL。
视图只返回列的子集,但它不是可以为空的。
任何帮助都将不胜感激。
答案 0 :(得分:3)
sqlbulkcopy不会在具有相同名称的列之间自动映射。它假定您的选择将按照它在目标表中看到的顺序返回列。
因此,如果目标表中有7列,并且视图返回5,则会尝试将这5列放在目标表的前5列中。
SqlBulkCopy类可以采用列映射的集合。那应该是诀窍
答案 1 :(得分: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 中的选择。
答案 2 :(得分:0)
尝试将SET DATEFORMAT设置为正确的格式(ymd,dmy,mdy,...)以进行连接并重试。如果您有本地化格式的日期而不是与语言环境无关的格式,则通常会发生此错误。
至于在一个插入中执行此操作不建议这样做,因为这被视为长时间运行的事务而不是批量插入操作。