【发布时间】:2011-01-19 08:29:41
【问题描述】:
EXCEL 中是否有与 Microsoft OLE DB Provider for Jet 4.0 相关的 SQL 语法参考/手册?
例如,如何写日期类型的常量?
有哪些关键字/功能/子句可用?
【问题讨论】:
EXCEL 中是否有与 Microsoft OLE DB Provider for Jet 4.0 相关的 SQL 语法参考/手册?
例如,如何写日期类型的常量?
有哪些关键字/功能/子句可用?
【问题讨论】:
当使用 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 中,TRUE 和 FALSE 条件都被评估,在 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 所见'可能会因此而改变。
【讨论】:
有哪些关键字/函数/子句可用?
关于函数列表,我在文件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 个函数的综合列表。
【讨论】:
Array 在 SQL 查询中工作。 IIF 的行为与 VBA 的 IIf 不同(能够短路)。在您的列表中没有提到CDEC,但无论如何它在 SQL 中没有做任何有用的事情!