【问题标题】:Any references/manuals on SQL in EXCEL with Microsoft OLE DB Provider for Jet 4.0?使用 Microsoft OLE DB Provider for Jet 4.0 的 EXCEL 中的 SQL 的任何参考/手册?
【发布时间】:2011-01-19 08:29:41
【问题描述】:

EXCEL 中是否有与 Microsoft OLE DB Provider for Jet 4.0 相关的 SQL 语法参考/手册?

例如,如何写日期类型的常量?

有哪些关键字/功能/子句可用?

【问题讨论】:

    标签: sql excel oledb


    【解决方案1】:

    当使用 Excel 作为 Jet 4.0 数据源时,我所知道的最佳参考是:

    How To Use ADO with Excel Data from Visual Basic or VBA

    特别重要的是当现有列包含mixed data types 时,如何确定其整体数据类型。

    关于 Jet 4.0 的 Microsoft OLE DB Provider,最相关的文章是:

    ADO Provider Properties and Settings: Microsoft Jet 4.0 Provider Properties

    也就是说,Excel 特定的细节在前面的文章中有更好的介绍。

    使用 Excel 和 SQL 时应注意的一个重要问题:

    BUG: Memory leak occurs when you query an open Excel worksheet by using ActiveX Data Objects (ADO)

    什么是关键字/功能/子句 可用吗?

    关于使用 Jet 4.0 SQL,这篇文章是我发现的最好的:

    Intermediate Microsoft Jet 4.0 SQL

    理论上,SQL section of the Access Help 应该是相关的,但它属于 particularly low quality,而且 Jet 4.0 的覆盖范围特别差。

    同样,并非所有内容都可以直接在 Excel 中运行。例如,尽管您可以使用CREATE TABLE SQL DDL 创建新的工作表和工作簿,但您不能创建NOT NULLable 列,因为这在物理上是不可能的。此外,Excel 的数据类型粒度较小,例如大多数数字类型映射到DOUBLE FLOAT

    关于可以在 SQL 中使用的表达式,Jet 4.0 表达式服务以某种方式使用 VBA 表达式服务。从广义上讲,Jet 可以使用任何 VBA 5.0(不是最新版本,是 VBA 6.0)函数,该函数不是一种包含值的方法,并且返回单个值,仅具有简单的内在数据类型(没有数组,没有对象等) )。我认为我说 Microsoft 从未明确发布过 Jet 4.0 支持的 VBA 函数的明确列表是正确的。但是,我相信以下文章中的列表恰好与 Jet 4.0 中可用的 VBA 函数列表完全一致:

    How to configure Jet 4.0 to prevent unsafe functions from running in Access 2003

    (该列表位于副标题“使用 Jet 4.0 Service Pack 3 及更高版本的沙盒模式操作”下的表格中。)

    请注意,某些函数在 Jet 4.0 中的行为与在 VBA 中的行为不同。在我的脑海中,我能想到两个。 IIF() 可以在 Jet 4.0 中使用快捷方式(未记录,AFAIK):在 VBA 中,TRUEFALSE 条件都被评估,在 Jet 4.0 中只评估匹配的条件。 CDEC()(转换为DECIMAL)函数是broken in Jet 4.0

    如何编写日期类型的常量? 我的意思是表达方式 以SQL中的2011.01.20(这个常量值)为例,我用吗 '2011-01-20',或 #2011-01-20#,或 还有什么?

    我知道这是一个“字面值”。

    这与 VBA 相同,即 #m/d/yyyy#,所以今天的日期是 #1/20/2011#。但是,我更喜欢使用ISO 8601 日期格式和单引号(出于可移植性考虑)并始终包含时间字段(因为 Jet 4.0 只有一种时间数据类型,即 DATETIME),并且为了确保尊重区域设置,请使用CDATE() 转换为 DATETIME 函数,例如今天的日期是CDATE('2011-01-20 00:00:00')


    [最初认为 OP 的意思是,“如何创建DATE 类型的列?”]

    您可以使用CREATE TABLE DDL,例如

    CREATE TABLE [Excel 8.0;DATABASE=C:\MyNewWorkbook.xls].MyTable 
    (
     my_date_col DATETIME
    );
    

    请注意,虽然 Jet 4.0 将遵循 DATETIME 的数据类型,但在 Excel 中编辑工作簿时没有这样的约束:如果表 Range 已扩展并添加了非临时数据,则数据类型为 ' Jet 4.0 所见'可能会因此而改变。


    【讨论】:

    • 我说写日期类型的常量,我的意思是用SQL来表达2011.01.20(这个常量值)的方式,比如我是用'2011-01-20'还是# 2011-01-20#,还是别的什么?
    • 谢谢,这是一个非常全面的链接列表。我要补充的是 .xlsb 文件似乎比 xlsm 或 xls 差;一个可靠(如果麻烦)的解决方法是间接读取数据:将数据转储到本地临时文件夹中的 csv 文件中,然后使用 Jet Text ISAM 读取它们。
    【解决方案2】:

    有哪些关键字/函数/子句可用?

    关于函数列表,我在文件MSMDCB80.DLL中找到了以下名称列表:

    YEAR, WEEKDAY, VarType, Val, UCase$, UCase, TypeName, TRIM$, TRIM, TIMEVALUE, TimeSerial, Timer, TIME$, TIME, TAN, SYD, Switch, String$, String, StrConv, StrComp, Str$, Str, Sqr, Space$, Space, SLN, SIN, Sgn, SECOND, RTrim$, RTrim,Round, Rnd, RIGHTB$, RIGHTB, RIGHT$, RIGHT, RGB, RATE, QBColor, PV, PPMT, PMT, Partition, Oct$, Oct, NPV, NPER, NOW, MONTH, MIRR, MINUTE, MIDB$, MIDB, MID$, MID, LTrim$, LTrim, LOG, LENB, LEN, LEFTB$, LEFTB, LEFT$, LEFT, LCase$, LCase, IsObject, IsNumeric, IsNull, ISERROR, IsEmpty, IsDate, IRR, IPMT, INT, InStr, IMEStatus, IIF, HOUR, Hex$, Hex, Fv, Format$, Format, Fix, EXP, Error$, Error, DDB, Day, DATEVALUE, DATESERIAL, DatePart, DateDiff, DATEADD, DATE$, Date, CVErr, CvDate, CVAR, CSTR, CSNG, COS, CLNG, CINT, CHRW$, CHRW, CHRB$, CHRB, CHR$, CHR, Choose, CDBL, CDATE, CCUR, CBYTE, CBOOL, ATN, ASCW, ASCB, ASC, Array, ABS

    他们的论据和描述可以找到here

    每个函数都在我的 SQL 查询中工作,所以我猜,这是 125 个函数的综合列表。

    【讨论】:

    • StackOverflow:弥补 2008 年以来供应商的懒惰
    • 我无法让Array 在 SQL 查询中工作。 IIF 的行为与 VBA 的 IIf 不同(能够短路)。在您的列表中没有提到CDEC,但无论如何它在 SQL 中没有做任何有用的事情!
    • 我认为您的列表与我在答案中链接到的列表相同:support.microsoft.com/en-gb/kb/294698
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多