代码之家  ›  专栏  ›  技术社区  ›  Tim Ebenezer

sqlbackcopy失败,出现字符串转换问题

  •  0
  • Tim Ebenezer  · 技术社区  · 16 年前

    我有一个视图,它生成许多列,我希望将这些列大容量加载到另一个具有相同名称的列的表中。

    当我在sqldatareader上循环并每次使用sqlcommand使用sqlparameters执行插入操作时,此过程工作得很好。显然,对于许多100000行来说,这太慢了。

    我切换到使用sqlblkcopy,因为视图列名和目标DB表列名和类型匹配(因为上述过程有效!).

    但是,在第一条记录上,它失败,并显示InvalidOperationException,即“无法将类型string的给定值转换为指定目标列的类型smalldatetime”。第一行中只有一个日期列,其值为空。

    视图只返回列的一个子集,但它不是所有列都可以为空。

    任何帮助都将不胜感激。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Mike Two    16 年前

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

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

    sqlblkcopy类可以接受列映射的集合。这应该会起作用的

        2
  •  0
  •   Adriaan Stander    16 年前

    为什么不只用一个SQL语句

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

    如果视图与表具有相同的列,则可以在 你的桌子 将语句改为

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

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

    然后还可以将WHERE子句应用于select from 你的观点 .

        3
  •  0
  •   Mladen Prajdic    16 年前

    尝试设置 SET DATEFORMAT 为您的连接更正格式(YMD、DMY、MDY等),然后重试。如果日期是本地化格式而不是区域设置独立格式,则通常会发生此错误。

    对于一次插入,不建议这样做,因为这被认为是一个长时间运行的事务,而不是大容量插入操作。