SQL Server使用OPENROWSET读取带动态日期文件名的Excel返回空值问题
问题原因分析
你的两种写法都不符合OPENROWSET的语法要求,核心问题如下:
- OPENROWSET的所有参数仅支持字符串常量,不允许直接在参数中嵌入SQL查询、或者直接拼接变量,第一种写法里的SELECT语句会被当成文件名的普通字符处理,自然找不到对应文件。
- 第二种写法除了参数不支持直接拼接变量的问题外,直接将DATETIME类型和字符串拼接会触发隐式转换,生成的日期格式也不符合你需要的
yyyyMMdd规范。
正确实现方案
需要通过动态SQL拼接完整的查询语句后再执行,示例代码如下:
-- 声明动态SQL变量、日期格式化变量 DECLARE @sql NVARCHAR(MAX) DECLARE @dateStr VARCHAR(8) -- 将当前日期转换为yyyyMMdd格式的字符串,112是SQL Server对应该格式的转换编码 SET @dateStr = CONVERT(VARCHAR(8), GETDATE(), 112) -- 拼接完整查询语句,注意字符串内部的单引号需要用两个单引号转义 SET @sql = N' SELECT * FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0 Xml;Database=\\DB\A\B\FILE1_'+@dateStr+'_1.xlsx'', ''SELECT * FROM [Sheet1$]'') ' -- 执行动态SQL EXEC sp_executesql @sql
注意事项
- 驱动建议使用
Microsoft.ACE.OLEDB.12.0,兼容性优于旧版的Microsoft.OLEDB.12.0,同时要确保SQL Server服务运行账户拥有\\DB\A\B\共享路径的读取权限,否则也会返回空结果或报错。 - 如果查询的是.xls后缀的旧版Excel文件,将连接参数里的
Excel 12.0 Xml改为Excel 8.0即可。 - 如果执行时报
Ad Hoc Distributed Queries未启用的错误,先执行以下语句开启相关配置:
sp_configure 'show advanced options', 1 RECONFIGURE GO sp_configure 'Ad Hoc Distributed Queries', 1 RECONFIGURE GO
- 要保证SQL Server的位数(32位/64位)和安装的Access Database Engine驱动位数一致,避免驱动不兼容问题。
内容的提问来源于stack exchange,提问作者Pak telo
相关产品推荐
相关产品推荐

