下边列出sql server与access的语法差别,方便更换程序数据库时查询。
日期分隔符号
access:英镑符(#)
sql server:撇号(')
Boolean 常量
access:True、False;On、Off;Yes、No;整数:-1(真)、0(假)。
sql server:整数:1(真)、0(假)
字符串连接
access:和号(&)
sql server:加号(+)
通配符
access:星号(*)与零个或更多字符匹配。
问号(?)与单个字符匹配。
叹号(!)意味着不在列表中。
英镑符(#)意味着单个数字。
sql server:百分号(%)与零个或更多字符匹配。
下划线(_)与单个字符匹配。
上插入符(^)意味着不在列表中。
没有与英镑符(#)对应的字符。
DROP INDEX
access:Drop Index <索引名> ON <表名>
sql server:Drop Index <表名>.<索引名>
表添加标识列
access:alter table <表名> add <列名> Counter(1,1)
sql server:alter table <表名> add <列名> bigint identity(1,1) not null
一、有区别的函数及解决方案
以下所示的解决方案中的函数定义在untDataBase单元中TAdoConn类的方法中。
号 | 简述 | Access语法 | SqlServer语法 | Oracle语法 | DB2语法 | 解决方案 |
01 | 系统时间 | Date() | GETDATE() | SYSDATE | GetSysTimeStr | |
02 | 连接字符串 | & | + | || | + | GetConcatStr |
03 | 截取字符串 | SubString
|
SubStr
|
SubString | SubString | GetSubStr |
04 | 小写字符串 | LCase | Lower | Lower | Lower | GetLowerStr |
05 | 大写字符串 | UCase | Upper
|
Upper
|
Upper
|
GetUpperStr |
06 | 查找字符串 | InStr
|
InStr
|
CharIndex
|
InStr
|
GetFindStr |
07 | 替换空值 | IIF+IsNull | Coalesce
|
Nvl | Coalesce | GetNullStr |
08 | 条件取值 | IIF | Case+When+Else | DeCode或Case
|
IIF
|
GetCaseStr |
09 | 字段类型转换 | Str、var、…. | Convert或cast
|
To_Char,To_Number. | GetConvertStr
|
GetConvertStr |
10 | 日期字符串
|
‘2004-10-9'
|
#2004-10-19#
|
‘2004-10-9' | GetDateStr | |
11 | 最大值加1
|
GetNextNumStr | ||||
12 | Like语句函数 | Like ‘101* | Like ‘101%'
|
Like ‘101%'
|
GetLikeStr | |
二、Access与SQLSERVER部分相同数据库函数及关键字列表
1、 函数
序号
|
简述 | |
01 | 记数函数
|
Count |
02 | 最大值 | Max |
2、 关键字
序号
|
简述 | |
01 |
|
Like |
02 | 连接 | Join |
03 | 判断空 | Is Null |
三、Access与语句SqlServer的语句语法区别
1、InserInto…..Select…From语句:
在ACCESS中以下语句
InsertINTO
PubSubJectAccCopys(Copy_id,Acc_id,Acc_Pid,Acc_name,acc_short,Acc_Comment,Acc_Pro,acc_type,Sub_id_flag,acc_index)(Select200201,Acc_id,Acc_Pid,Acc_name,acc_short,Acc_Comment,Acc_Pro,acc_type,Sub_id_flag,acc_indexFROMPubSubJectAccWherePubSubJectAcc.co_type='03')
中后面"(select200201******.co_Type='03')"中的小括号("(",")")必须去掉才能执行,如下:
InsertINTO
PubSubJectAccCopys(Copy_id,Acc_id,Acc_Pid,Acc_name,acc_short,Acc_Comment,Acc_Pro,acc_type,Sub_id_flag,acc_index)Select200201,Acc_id,Acc_Pid,Acc_name,acc_short,Acc_Comment,Acc_Pro,acc_type,Sub_id_flag,acc_indexFROMPubSubJectAccWherePubSubJectAcc.co_type='03'
在SQLSERVER中都可以
2、InnerJoin语句1
StrSql:='selecta.user_id,a.user_opcode,b.copy_namefromsysuserainnerjoin(syscopysusercinnerjoinsyscopysbonc.copy_id=c.copy_id)ona.user_id=c.user_idwhere
a.user_opcode='''+EdtUserOpCode.text+'''Andcopy_name='''+Tmpcopyname+'''';
应该改为
StrSql:='selecta.user_id,a.user_opcode,b.copy_namefromsysuserainnerjoin(syscopysusercinnerjoinsyscopysbonc.copy_id=d.copy_id)ona.user_id=c.user_idwhere
a.user_opcode='''+EdtUserOpCode.text+'''Andcopy_name='''+Tmpcopyname+'''';
该行代码的检索条件错误:应该把C.copy_id=C.Copy_id改为c.copy_id=d.copy_id
注:两种写法都能在SQL-SERVER中运行,但c.copy_id=C.copy_id在ACCESS中不能运行
3、InnerJoin语句2
StrSql:='selectcopy_year,copy_name,a.copy_idfromSysCopysainnerjoinSysCopysUserbona.curcopy_flag=1anda.copy_id=b.copy_idwhereb.user_id='+''''+TmpPubUserID+'''';
该为
StrSql:='selectcopy_year,copy_name,a.copy_idfromSysCopysainnerjoinSysCopysUserbona.copy_id=b.copy_idwherea.curcopy_flag=''1''andb.user_id='+''''+TmpPubUserID+'''';
注:两种写法都能在SQL-SERVER中运行,但第一种在ACCESS中不能运行
4、InnerJoin语句3
SQlserver中可以执行以下语句
'Selectdistinctsysoption.opti_id,sysoption.opti_name,sysoption.opti_code,sysroleoption.opti_sortFromsysoptioninnerjoinsysroleoptionONsysoption.opti_id=sysroleoption.opti_idANDsysroleoption.role_id=:roleid'
但ACCESS中不能,只能
'Selectdistinctsysoption.opti_id,sysoption.opti_name,sysoption.opti_code,sysroleoption.opti_sortFromsysoptioninnerjoinsysroleoptionONsysoption.opti_id=sysroleoption.opti_idWheresysroleoption.role_id=:roleid'
5、Update语句
SqlSerVer中能执行但Access中不能
'UpdatesysuserroleSETsysuserrole.role_sort=(Selectsysrole.role_sortFROMsysroleWheresysuserrole.role_id=sysrole.role_idandsysuserrole.user_id='01')'
6、日期比较
SQLSERVER中用
StrSql:='selectcopy_year,Start_month,Cur_month,Start_Flag,Start_date,End_date'
+'FromSysCopys'
+'wherecopy_id='''+LoginCopyID+''''
+'andstart_date<='''+datetostr(LoginDate)+''''
+'andend_date>='''+datetostr(LoginDate)+'''';
ACCESS中用
StrSql:='selectcopy_year,Start_month,Cur_month,Start_Flag,Start_date,End_date'
+'FromSysCopys'
+'wherecopy_id='''+LoginCopyID+''''
+'andstart_date<=#'+datetostr(LoginDate)+'#'
+'andend_date>=#'+datetostr(LoginDate)+'#'
参考以上的第10个函数“GetDateStr”
7、最大数值获取语句
StrSql:='insertintosysRoleOption'
+'select'''+fidRoleId+'''asRole_ID,opti_id,'
+'convert(numeric,opti_id)-(convert(numeric,opti_parentid)*100)+'+MaxOptiSort
+'asopti_Sortfromsysoptionwhereopti_parentid='''
+PCoTypeID(self.trvRoles.Selected.data)^.StrCoTypeID
+'''andopti_bottom=''1'+'''';
改为
StrSql:='insertintosysRoleOption'
+'select'''+fidRoleId+'''asRole_ID,opti_id,'
+'opti_id-opti_parentid*100+'+MaxOptiSort
+'asopti_sortfromsysoptionwhereopti_parentid='''
+PCoTypeID(self.trvRoles.Selected.data)^.StrCoTypeID
+'''andopti_bottom=''1'+''''
注:两种写法都能在SQL-SERVER中运行,但第一种在ACCESS中不能运行
但是考虑会出现Null值以及语句的通用性,可以使用以上的第07个函数“GetNullStr”和第09个函数“GetConvertStr”来完成字符串向数字,空值和0数字的转换:参考GetNextNumStr代码。