工作表范围内定义名称的表名是什么?

Jen*_*off 5 sql delphi excel odbc

我正在尝试使用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 
Run Code Online (Sandbox Code Playgroud)

请注意,这myname是工作簿范围,而不是工作表作用域.

我原以为像Excel公式中的东西也适用于ODBC表名:

SELECT * FROM worksheet1!myname   -- Query a worksheet scoped defined name
Run Code Online (Sandbox Code Playgroud)

但是这不起作用,我尝试了一些语法变体.

这是可能的,如果是,那么使用什么语法?

注意Delphi开发者:该A1:C10语法会导致麻烦TADOQuery,你必须设置ParamCheck到False为了这个工作.

更新:

我正在使用随附的Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)版本.12.00.6606.1000Microsoft Office 2007

我已经检查过我正在使用的Delphi数据库组件的行为方式与Microsoft Query和Microsoft Access 2007相同.

Jen*_*off 1

假设您有一个 Excel 文件(在我的例子中为 xlsx),其名称如下(Excel 公式表示法):

  • myname
  • worksheet1!myname
  • worksheet2!myname

不同版本的 Excel ODBC 驱动程序具有不同的行为:

附带的版本的行为Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)如下:12Microsoft Office 2007

命名空间被扁平化。

您可以查询的只有SELECT * FROM myname. 显然,这会返回定义的名字的数据。

附带的版本(可以从 Microsoft 单独下载Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb))的行为如下:14Microsoft Office 2010

您确实可以查询所有三个:

SELECT * FROM myname
SELECT * FROM [worksheet1$myname]
SELECT * FROM [worksheet2$myname]
Run Code Online (Sandbox Code Playgroud)

所以这显然是固定在Microsoft Office 2010.

该修复不向后兼容。当您在 2007 年定义了工作表范围名称时,您可以使用myname仅适用于 2010 年工作簿范围名称的语法来查询它。因此,在不同版本的 Office 中处理这种情况时需要小心。

注意:如果下载链接失效,请搜索Microsoft Access Database Engine 2010 Redistributable.