【DM版本】:03134284604-20260707-335949-20228
【操作系统】:Kylin V10
【CPU】:x86
【问题描述】*:SQL server opendatasource连接excel文件进行数据操作,请问达梦这边是否有替代方案?
SELECT @errorMessage = REPLACE((SELECT CAST(行号 AS VARCHAR(10)) + ',' + 二维码 + '—'
FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0',
'Data Source=D:\tes二维码导入共享\二维码.xlsx;Extended Properties=Excel 12.0')...[Sheet1$]
WHERE ISNULL(二维码,'') <> ''
AND (CHARINDEX('B',RIGHT(二维码,6)) > 0 OR CHARINDEX('I',RIGHT(二维码,6)) > 0
OR CHARINDEX('O',RIGHT(二维码,6)) > 0 OR CHARINDEX('Z',RIGHT(二维码,6)) > 0)
ORDER BY CAST(行号 AS INT)
FOR XML PATH('')),'—',CHAR(13) + CHAR(10))

达梦没有
OPENDATASOURCE(实测报-2207 无法解析的成员访问表达式),SQL 里不能直连 Excel 文件。替代方案是外部表 + CSV:把 Excel 另存为 CSV,建外部表后按普通表查询,原 SQL 逻辑基本可以平移。
改造示例
-- 1) 建目录对象(指向 CSV 所在目录) CREATE OR REPLACE DIRECTORY "EXTDIR" AS '/data/import'; -- 2) 建外部表(列对应 Excel 的列) CREATE EXTERNAL TABLE ext_qr("行号" INT, "二维码" VARCHAR(100)) FROM DATAFILE DEFAULT DIRECTORY EXTDIR LOCATION('二维码.csv') PARMS(FIELDS DELIMITED BY ',', CHARACTER_CODE 'UTF-8'); -- 3) 原查询改造 SELECT REPLACE( LISTAGG(CAST("行号" AS VARCHAR(10)) || ',' || "二维码" || '—', '') WITHIN GROUP (ORDER BY CAST("行号" AS INT)), '—', CHR(13) || CHR(10) ) AS MSG FROM ext_qr WHERE ISNULL("二维码",'') <> '' AND (INSTR(RIGHT("二维码",6),'B') > 0 OR INSTR(RIGHT("二维码",6),'I') > 0 OR INSTR(RIGHT("二维码",6),'O') > 0 OR INSTR(RIGHT("二维码",6),'Z') > 0);函数对应关系
OPENDATASOURCE(...)[Sheet1$]CREATE EXTERNAL TABLEFOR XML PATH('')LISTAGG(...) WITHIN GROUPCHARINDEX(a,b)INSTR(b,a)CHAR(13)CHR(13)几点注意
PARMS里要加CHARACTER_CODE 'UTF-8',否则乱码"行号"PARMS(..., SKIP 1)跳过首行LISTAGG没有 Oracle 的 4000 字节限制,长文本可以完整拼接如果数据量较大或需要反复查询,也可以先用
dmfldr装载到普通表再查,性能更好。以上写法我已在 8.1.4.169 和 8.1.5.60 上实测通过。