【问题标题】:Error converting data types when importing from Excel to SQL Server 2008从 Excel 导入 SQL Server 2008 时转换数据类型时出错
【发布时间】:2021-06-20 13:04:22
【问题描述】:

每次我尝试将 Excel 文件导入 SQL Server 时,都会遇到特定错误。当我尝试编辑映射时,所有数字字段的默认值都是浮点数。我表中的所有字段都没有小数,它们不是货币数据类型。它们只有 8 位数字。但是,由于我不希望我的主键在它是 int 时存储为浮点数,我该如何解决这个问题?它给了我某种截断错误,如果需要,我会发布一个屏幕截图。这是一个常见的问题吗?

应该注意的是,我无法导入 Excel 2007 文件(我想我已经找到了解决方法),但即使我尝试导入 .xls 文件,每个包含数字的值都会自动导入为浮点数,并且何时我尝试更改它,但出现错误。

http://imgur.com/4204g

【问题讨论】:

  • 您使用什么工具进行导入?西斯?准确了解“某种错误”的含义会很有帮助。
  • @Pondlife,我正在使用 SSMS 中的导入向导。指向错误的链接已在原始帖子中进行了编辑。

标签: sql-server sql-server-2008


【解决方案1】:

SSIS 不会隐式转换数据类型,因此您需要显式地进行。 Excel 连接管理器只能处理几种数据类型,它会尝试根据文件的前几行做出最佳猜测。这完全是 SSIS 文档中的 documented

您有多种选择:

  • 将目标数据类型更改为浮点数
  • 使用导入向导加载到具有浮点数据类型的“暂存”表,然后使用CASTCONVERT 将数据转换为实际目标表中的INSERT 以转换数据
  • 创建一个 SSIS 包并使用Data Conversion 转换来转换数据

您可能还想注意Import Wizard documentation 中关于数据类型映射的 cmets。

【讨论】:

  • 我在想我必须制作一个“临时”表。我不想诉诸于此,因为我认为这很笨拙,但如果它有效,我想它会有效。谢谢! :)
  • 我确实做了一个临时表,但是所有不能转换为浮点数的值都被默默地转换为 NULL。
【解决方案2】:

脱离 Derloopkat 所说的,转换仍然会失败(没有冒犯 Derloopkat),因为 Excel 在这方面很糟糕:

  1. 从 excel 粘贴到记事本中并保存为普通文件(.txt 文件)。
  2. 在 excel 中,打开上述 .txt 文件。
  3. 选择下一步,因为它显然是制表符分隔的。
  4. 为文本限定符选择“无”,然后再次选择下一步。
  5. 选择第一行,按住 shift,选择最后一行,然后选择文本单选按钮。点击完成

它会打开,检查它以确保它是准确的,然后保存为 excel 文件。

【讨论】:

  • derloopkat 在他的问题下对您的评论的回答准确地总结了我的想法
  • 这对我不起作用。在 SQL Server 2012 中,它仍然尝试将列转换为浮点数。
【解决方案3】:

有一个解决方法。

  1. 将带有数字的 Excel 工作表导入为浮点数(默认)。
  2. 导入后,转到表设计
  3. 将列的 DataType 从 Float 更改为 Int 或 Bigint
  4. 保存更改
  5. 将列的 DataType 从 Bigint 更改为任何文本类型(Varchar、nvarchar、text、ntext 等)
  6. 保存更改。

就是这样。

【讨论】:

    【解决方案4】:

    当 Excel 在同一列中发现混合数据类型时,它会猜测该列的正确格式(大多数值决定列的类型)并通过插入 NULL 来忽略所有其他值。但是 Excel 做得很糟糕(例如,如果一列被认为是文本并且 Excel 找到一个数字然后确定该数字是错误的并插入 NULL 代替,或者如果某些包含数字的单元格是“文本”格式,则可能会得到 NULL 值到数据库的整数列中)。

    解决方案:

    1. 使用第一行中的列名创建一个新的 Excel 工作表
    2. 将列格式化为文本
    3. 粘贴行无格式(使用 CVS 格式或在记事本中复制/粘贴以仅获取文本)

    请注意,仅对现有 Excel 工作表上的列进行格式化是不够的。

    【讨论】:

    • 你的解决方案同样的问题,它会将号码保存为 VarChat,这不起作用......
    • 此页面提供的所有解决方案都需要手动更改列类型。抱歉,我假设有人知道该怎么做。上面的问题是如何防止整数变成浮点数、被截断等,更具体地说是避免出现“错误转换数据类型”的错误消息。
    • 使用 MSSQL 2012 和 Office 15.0 这对我不起作用。 SSIS 仍然希望将列转换为浮点数。
    【解决方案5】:

    在处理数据类型问题时,似乎有一个真的简单的解决方案。

    基本上,在 Excel 连接字符串的末尾,添加;IMEX=1;"

    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\YOURSERVER\shared\Client Projects\FOLDER\Data\FILE.xls;Extended Properties="EXCEL 8.0;HDR=YES;IMEX=1";
    

    这将解决数据类型问题,例如值与文本和数字混合的列。

    要访问连接属性,请右键单击控制流下方的 Excel 连接管理器并点击属性。它将在解决方案资源管理器下的右侧。希望对您有所帮助。

    【讨论】:

    • 即使使用 IMEX=1,它也假设我的字段是一个字符串字段,并去掉数字中的有效数字。例如。我的号码 987654321 变为 9.876543e+008。再次将它导入的内容转换回一个数字,得到 987654300,丢失了最后两位数。 Excel 与实际数据的互操作性完全失败。我正试图让我所有的客户从他们的机器上删除 Excel,但他们都上瘾了——精神依赖的羊。
    • 有趣。是的,Excel 在格式化方面可能会非常麻烦。 munishbansal.wordpress.com/2009/12/15/… 这是我找到的关于这个主题的最佳资源,应该可以帮助您处理大量数据。我以前没有用过这样的数字,所以这对我来说是一个新问题。
    【解决方案6】:

    简单的避免float类型字段:

    1. 打开您的 Excel 工作表..
    2. 在标题行后插入空白行并在所有单元格中输入(任何文本)。
    3. 鼠标右键单击导致浮动问题的列的标题并选择(格式化单元格),然后选择类别(文本)并按确定。

    然后将 excel 表导出到您的 SQL 服务器。

    这种简单的方法对我有用。

    【讨论】:

      【解决方案7】:

      在紧要关头考虑的解决方法:

      1. 保存一份excel文件,修改列格式为'text'
      2. 复制列值并粘贴到文本编辑器,保存文件(称为 tmp.txt)。
      3. 将文本文件中的数据修改为以字符开头和结尾,以便 SQL Server 导入机制将识别为文本。如果您有精美的编辑器,请使用随附的工具。我在 Windows 笔记本电脑上的 cygwin 中使用 awk。例如,我用单引号开始结束列值,例如 "$ awk '{print "\x27"$1"\x27"}' ./tmp.txt > ./tmp2.txt"
      4. 将 tmp2.txt 中的数据复制并粘贴到 excel 文件中必要列的顶部,然后保存 excel 文件
      5. 为您修改后的 excel 文件运行 sql server 导入...请务必仔细检查导入器选择的数据类型不是数字...如果是,请使用不同的字符集重复上述步骤李>

      导入完成后,数据库中的数据将带有引号...您可以稍后更新数据以删除引号,或在读取查询中使用“替换”功能,例如“替换([dbo].[MyTable].[MyColumn], '''', '')"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-26
        • 2011-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多