工作表范围内已定义名称的表名是啥?

Posted

技术标签:

【中文标题】工作表范围内已定义名称的表名是啥?【英文标题】:What's the table name for a defined name in the scope of a worksheet?工作表范围内已定义名称的表名是什么? 【发布时间】:2013-07-18 16:07:18 【问题描述】:

我正在尝试使用 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 才能使其正常工作。

更新:

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

我检查了我使用的 Delphi 数据库组件的行为方式与 Microsoft Query 和 Microsoft Access 2007 相同。

【问题讨论】:

有人认为[worksheet1$myname] 不起作用? 您是仅从 Delphi 中尝试过,还是从其他 MS Office 产品中尝试过?例如 MS Access? 另见:***.com/questions/18798522/… 【参考方案1】:

尝试以下方法来帮助您找出 Delphi 正在寻找的名称。

    在表单上放置一个组合框。 运行以下代码以使用 Delphi 将接受的名称填充组合框:AdoConnection1.GetTableNames(ComboBox1.Items,True); 运行应用程序。组合框应为您提供可查询名称的列表。

使用 Delphi XE2 和 Office 2010(保存为 office 97 xls 格式的 Excel 文件)我创建了一个工作表范围命名为 range (sheet1!numberlist) 并在 Delphi 中运行了一个 ADO 查询。查询是SELECT * FROM [sheet1$numberlist]。也许是你的 ODBC 驱动程序?

【讨论】:

确实有不同的ODBC驱动,我去看看。 GetTableNames 调用是个好主意。 我使用的驱动是Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)版本12.00.6606.1000【参考方案2】:

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

myname worksheet1!myname worksheet2!myname

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

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

命名空间是扁平的。

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

14 附带的Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) 版本Microsoft Office 2010 (and can be downloaded separatly from Microsoft) 的行为如下:

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

SELECT * FROM myname
SELECT * FROM [worksheet1$myname]
SELECT * FROM [worksheet2$myname]

所以这显然已在 Microsoft Office 2010 中修复。

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

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

【讨论】:

以上是关于工作表范围内已定义名称的表名是啥?的主要内容,如果未能解决你的问题,请参考以下文章

请问下在sql server中,我创建约束的时候没有定义约束名,它默认的约束名是啥呀?

表名是啥?

vb6.0改Excel的工作表名

Windows 中的 MySQL 小写表名 Unix 上的大写名称

当使用SQLserver时,当连接参考已建立的表格,却显示引用的表无效,是啥原因

如何使用基于自定义参数的表名中类似于 python 的字符串格式查询谷歌数据工作室中的 bigquery 表?