我正在尝试使用ODBC使用SQL查询工作表范围中的已定义名称。
我已经知道这有效:
SELECT * FROM [worksheet1$] -- Query a whole worksheet
SELECT * FROM [worksheet1$A1:C10] -- Query A1:C10 of a worksheet
SELECT * FROM myname -- Query a workbook scoped defined name
请注意,myname
是工作簿范围,而不是工作表范围。
我原本预计Excel公式中的某些内容也适用于ODBC表名:
SELECT * FROM worksheet1!myname -- Query a worksheet scoped defined name
然而,这不起作用,我尝试了一些语法变体。
这是可能的吗?如果是,那么使用什么语法?
对于Delphi开发人员的注意事项:A1:C10
语法会导致TADOQuery
出现问题,您必须将ParamCheck
设置为False
才能使其生效。< / em>的
更新
我正在使用Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)
附带的12.00.6606.1000
版本Microsoft Office 2007
。
我已经检查过我正在使用的Delphi数据库组件的行为方式与Microsoft Query和Microsoft Access 2007相同。
答案 0 :(得分:1)
请尝试以下方法来帮助您找出Delphi正在寻找的名称。
AdoConnection1.GetTableNames(ComboBox1.Items,True);
使用Delphi XE2和Office 2010(excel文件保存为office 97 xls格式)我创建了一个范围名为range(sheet1!numberlist)的工作表,并在Delphi中运行了一个ADO查询。查询为SELECT * FROM [sheet1$numberlist]
。也许这是你的ODBC驱动程序?
答案 1 :(得分:1)
假设您有一个Excel文件(在我的情况下为xlsx),它具有以下名称(Excel公式表示法):
myname
worksheet1!myname
worksheet2!myname
不同版本的Excel ODBC驱动程序具有不同的行为:
Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)
附带的12
版本Microsoft Office 2007
的行为如下:
名称空间被夷为平地。
您只能查询SELECT * FROM myname
。显然,这将返回定义的第一个名称的数据。
Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)
(and can be downloaded separatly from Microsoft)附带的14
版本Microsoft Office 2010
的行为如下:
你确实可以查询所有这三个:
SELECT * FROM myname
SELECT * FROM [worksheet1$myname]
SELECT * FROM [worksheet2$myname]
所以这显然已在Microsoft Office 2010
修复。
修复程序不向后兼容。如果您在2007年定义了工作表范围名称,则可以使用myname
语法对其进行查询,该语法仅适用于2010年的工作簿范围名称。因此,在不同版本的Office中处理此情况时需要谨慎。
注意:如果下载链接失效,请搜索Microsoft Access Database Engine 2010 Redistributable
。