并非所有的行都能使用SQL Server中的OPENROWSET从Excel文件导入

4

我有一个包括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行,即每次导入的行数都不同。 然而,当我使用“任务->导入数据...”时,所有行都成功导入。 这种行为的原因是什么? 我正在使用SQL Server 2017 14.0.3356.2版本。

你的电子表格中是否存在数据间隙(即空白行)? - Thom A
@Larnu 不,没有缺口。正如我所说,“导入数据”工作得很好。这意味着“OPENROWSET”也应该能很好地工作。 - JohnyL
@JohnyL 如果您能添加示例数据,那么理解您的问题会更容易。 - droebi
@droebi 这些数据很敏感,但我会尝试用虚拟值替换它们。 - JohnyL
1
@SteveFord SteveC的答案解决了问题 - 问题在于语法,不过还要做一件事情(详见我的评论)。总之,感谢回答! - JohnyL
显示剩余3条评论
1个回答

1
SQL Server代码的语法与文档中的示例代码略有不同。要完全符合文档中代码的语法,应该像这样:
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有关。是否每个列都有没有空格和/或不寻常格式的标题行?如果需要,这是需要考虑的事情。

感谢您的回复!我会尝试一下! - JohnyL
1
经过一些测试,您的代码确实可以工作,但是为了使其正常工作,我不得不为“Microsoft.ACE.OLEDB.12.0”提供程序设置AllowInProcess=1DynamicParameters=1。只有在这之后,所有行才能成功导入!非常感谢! :) - JohnyL
我猜你需要在你的回答中提到设置这些参数。谢谢! - JohnyL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接