Date: 05.12.2006
Version: 1
By Alva Chien
这段时间一直忙着把我自己的一个项目从SQL Server平台上移植到Microsoft Jet SQL上,所谓Microsoft Jet SQL对我而言其实就是使用MDB文件(基于Microsoft Access 2003,文件格式: Office 2000/2003)了。不知道Microsoft出于什么目的,MSDN上查不到关于Jet SQL的一些细节,除了几篇’Intermediate Jet SQL’, ‘Advance Jet SQL’等文章;后来打开Access的帮助,也是狂简单,而且很老式的Windows帮助格式,查阅非常不便;偶尔一次上Office网站,才查到完整的Jet SQL的语法介绍,虽然简单,但是也可以用了。
虽然是个轻量级的数据库,但是Access还是支持了Stored Procedure(Access中成为查询),十分方便,而且关键字大致上兼容了Microsoft T-SQL的格式和ANSI SQL的格式,所以直接把以前的SQL Server的Stored Procedure直接复制过来执行一下就OK了,幸亏当初创建的时候没有过多的使用T-SQL的附加内容。
以下我是目前遇到的一些问题和解决方法:
遇到的第一个问题是,内置函数,Create Table和Create Procedure的时候,总是喜欢为Table中间的Field和Procedure中间的Parameter设置一些Default的值,然而Access的Jet SQL和SQL Server这方面差别不小,比如DateTime,获取当天时间,Jet SQL使用Now(),而T-SQL使用GetDate(),但是到现在我都没搞明白Uniqueidentifier (T-SQL的标志,Access的标准关键字是GUID),T-SQL提供了一个newid(),Jet SQL方面我还没找到,只能把这个Default的Constant删除。
遇到的第二个问题是,Create Procedure的参数格式不同,T-SQL强大的多和方便的多,而Jet SQL必须使用括号来包含所有参数,当然也可以使用Parameter语句。最重要的是,Jet SQL的Procedure只能使用一个Insert/Select/Update/Delete方法,也就是是说,只能包含一个SQL的DML语句。这个限制是始料不及的,不得不把以前的T-SQL包含了多个语句的Stored Procedure拆开来。
遇到的第三个问题是,到目前为止,我还没有找到办法通过Procedure的参数传入一个MEMO (Jet SQL)/nvarchar(max)(T-SQL),就是不限制大小的动态文本。有这样一个非常简单的例子(为了两个平台都能用,去除了Default定义):
CREATE TABLE T_TESTTABLE ([ITEM_DATE] DateTime PRIMARY KEY NOT NULL, [VERSION] UNIQUEIDENTIFIER NOT NULL, [CONTENT] TEXT NOT NULL)
创建一个Procedure来更新这个Table:
CREATE PROC PROC_TESTTABLE_UPDATE (@itemdate DateTime, @ver UNIQUEIDENTIFIER, @cont TEXT) AS UPDATE T_TESTTABLE SET [VERSION]=@ver, [CONTENT]=@cont WHERE [ITEM_DATE]=@itemdate
问题就在于,这个Procedure无论怎么调用都出现:”无法更新CONTENT;字段不可更新”。如果不使用这个Procedure,而直接使用SQL语句:
UPDATE T_TESTTABLE SET [VERSION]=’ 83F 04604-B392 -44A 5-9650-B45B055FCF1E’, [CONTENT]=’TEST STRING, WHO CARE IT?’ WHERE [ITEM_DATE]=’ 2006-12-04 ’
三个变量的内容当然随便了,都会成功。