【问题标题】:Not all rows are imported from Excel file using OPENROWSET in SQL Server并非所有行都是使用 SQL Server 中的 OPENROWSET 从 Excel 文件中导入的
【发布时间】:2020-10-01 09:13:34
【问题描述】:

我有一个 47 列和 14K 行的 Excel 表。我使用 OPENROWSET 将此数据导入 SQL Server:

INSERT INTO dbo.my_table
SELECT * FROM OPENROWSET
(
    'Microsoft.ACE.OLEDB.12.0',
    'Excel 12.0;HDR=Yes;Database=C:\ExcelFile.xlsx',
    'SELECT * FROM [Sheet1$]'
);

但是,只导入了 5138 行。一段时间后,导入的行数减少到 5052,即每次 - 不同的行数。 但是,当我使用Tasks -> Import Data... 时,all 行已成功导入。 这种行为的原因是什么?

我使用的是 SQL Server 2017 14.0.3356.2。

【问题讨论】:

  • 电子表格中的数据是否存在空白(即空白行)?
  • @Larnu 没有。没有间隙。正如我所指出的,Import Data 工作得很好。这意味着OPENROWSET 也应该可以正常工作。
  • @JohnyL 如果您可以添加示例数据,将更容易理解您的问题。
  • @droebi 数据很敏感,但我会尝试用虚拟值替换它。
  • @SteveFord SteveC 的回答成功了——问题出在语法上,尽管还需要做一件事(见我的评论)。无论如何,谢谢你的回答!

标签: sql-server openrowset aceoledb


【解决方案1】:

SQL Server 代码的语法与Docs 中的示例代码略有不同。为了完全符合文档中代码的语法,它应该看起来像这样

INSERT INTO dbo.my_table
SELECT * FROM OPENROWSET
(
    'Microsoft.ACE.OLEDB.12.0',
    'Excel 12.0;HDR=Yes;Database=C:\ExcelFile.xlsx',
    [Sheet1$]
);

工作表 [Sheet1$] 的名称不再包含在引号内,并且类似 SQL 的代码(“SELECT * FROM”)已被删除。

另一个可能的问题是指定 HDR=Yes。有/有任何行的每一列是否都有没有空格和/或不寻常格式的标题?如果需要,可以考虑。

【讨论】:

  • 感谢您的回复!我会试试看的!
  • 经过一些测试,您的代码确实可以工作,但为了工作,我必须为Microsoft.ACE.OLEDB.12.0 提供程序设置AllowInProcess=1DynamicParameters=1。只有在 all 行成功导入之后!非常感谢! :)
  • 我猜,您需要在答案中提及设置这些参数。谢谢! ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 2016-12-29
相关资源
最近更新 更多