OPENROWSET读取Excel文件异常:查询无限运行无响应
问题描述
执行以下OPENROWSET读取Excel文件的SQL语句时,出现无限期执行的情况——文件数据量极小(正常应耗时不到1秒),但查询一直无法完成,取消操作也需要很长时间:
SELECT * INTO #TempRawData FROM OPENROWSET ( 'Microsoft.ACE.OLEDB.16.0', --'Excel 12.0; Database={LOOP(CurrentValueXArray|0)}; HDR=NO; IMEX=1', 'Excel 12.0; Database=C:\root\DATA\Filename.xlsx; HDR=NO; IMEX=1', 'SELECT * FROM [Housekeeping$]' )
已尝试重启机器、重启SQL Server服务、更换文件及存储路径,均无效。通过sp_who2查看会话状态为RUNNABLE,命令为EXECUTE。此前在其他服务器也出现过该问题,改为本地执行后今早再次复现。
解决思路
- 检查ACE驱动与SQL Server的位数匹配:确保安装的
Microsoft.ACE.OLEDB.16.0驱动位数(32/64位)和SQL Server实例的位数完全一致。64位SQL必须搭配64位ACE驱动,32位同理,混合位数会导致驱动调用异常,引发无响应。 - 排查文件锁定或权限问题:
- 确认Excel文件没有被其他进程(比如Excel客户端、杀毒软件、备份工具)锁定,可通过资源监视器的「关联的句柄」搜索文件名,查看是否有进程占用。
- 检查SQL Server服务账户是否对文件所在路径(
C:\root\DATA\)有读取权限——即使本地执行,SQL服务账户可能不是当前登录用户,权限不足会导致驱动无限等待资源。
- 调整连接字符串参数:
- 尝试移除
IMEX=1参数,或改为IMEX=0,IMEX模式在某些特殊数据格式下可能引发驱动内部循环。 - 替换
Excel 12.0为Excel 12.0 Xml,明确指定处理xlsx格式,避免驱动格式识别混淆。 - 添加
ReadOnly=1参数,强制驱动以只读模式打开文件,减少资源竞争:'Excel 12.0 Xml; Database=C:\root\DATA\Filename.xlsx; HDR=NO; IMEX=1; ReadOnly=1'
- 尝试移除
- 检查OLEDB驱动的健康状态:
- 卸载并重新安装最新版的Microsoft Access Database Engine(包含ACE驱动),避免驱动文件损坏或版本兼容问题。
- 执行以下语句,确保Ad Hoc Distributed Queries配置正确(该选项禁用会导致OPENROWSET异常):
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;
- 排查SQL Server的线程调度问题:
- 会话状态为RUNNABLE说明线程正在等待CPU资源,检查服务器当前CPU负载,是否有其他高负载进程抢占资源;若CPU正常,尝试执行
DBCC FREEPROCCACHE和DBCC DROPCLEANBUFFERS清理缓存后重试。
- 会话状态为RUNNABLE说明线程正在等待CPU资源,检查服务器当前CPU负载,是否有其他高负载进程抢占资源;若CPU正常,尝试执行
- 尝试替代导入方案:
- 若ACE驱动问题无法快速解决,改用SSIS包导入Excel数据——SSIS对Excel的处理更稳定,且有更详细的错误日志。
- 使用PowerShell脚本读取Excel文件后插入到临时表,绕开OLEDB驱动的问题:
$excelPath = "C:\root\DATA\Filename.xlsx" $sqlServer = "." $dbName = "YourDatabase" $data = Import-Excel -Path $excelPath -WorksheetName "Housekeeping" -NoHeader $data | Write-SqlTableData -ServerInstance $sqlServer -DatabaseName $dbName -SchemaName dbo -TableName #TempRawData -Force
内容的提问来源于stack exchange,提问作者Femmer
相关产品推荐
相关产品推荐

