Access和sql server的语法区别
一、有区别的函数及解决方案
以下所示的解决方案中的函数定义在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、 Inser Into …..Select …From语句:
在ACCESS中以下语句
Insert INTO
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_indexFROM PubSubJectAcc Where PubSubJectAcc.co_type='03')
中后面"(select200201******.co_Type='03')"中的小括号("(",")")必须去掉才能执行,如下:
Insert INTO
PubSubJectAccCopys(Copy_id,Acc_id,Acc_Pid,Acc_name,acc_short,Acc_Comment,Acc_Pro,acc_type,Sub_id_flag,acc_index)Select 200201,Acc_id,Acc_Pid,Acc_name,acc_short,Acc_Comment,Acc_Pro,acc_type,Sub_id_flag,acc_indexFROM PubSubJectAcc Where PubSubJectAcc.co_type='03'
在SQL SERVER中都可以
2、 Inner Join语句1
StrSql:='select a.user_id,a.user_opcode,b.copy_name fromsysuser a inner join (syscopysuser c inner join syscopys b on c.copy_id=c.copy_id)on a.user_id=c.user_id where
a.user_opcode=''' +EdtUserOpCode.text+''' Andcopy_name='''+Tmpcopyname +'''';
应该改为
StrSql:='select a.user_id,a.user_opcode,b.copy_name fromsysuser a inner join (syscopysuser c inner join syscopys b on c.copy_id=d.copy_id)on a.user_id=c.user_id where
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、 Inner Join语句2
StrSql:='select copy_year,copy_name,a.copy_id fromSysCopys a inner join SysCopysUser b on a.curcopy_flag=1 anda.copy_id=b.copy_id where b.user_id=' + '''' +TmpPubUserID+ '''';
该为
StrSql:='select copy_year,copy_name,a.copy_id fromSysCopys a inner join SysCopysUser b on a.copy_id=b.copy_id wherea.curcopy_flag=''1'' and b.user_id=' + '''' +TmpPubUserID+ '''';
注:两种写法都能在SQL-SERVER中运行,但第一种在ACCESS中不能运行
4、 Inner Join语句3
SQl server 中可以执行以下语句
'Select distinctsysoption.opti_id,sysoption.opti_name,sysoption.opti_code,sysroleoption.opti_sortFrom sysoption inner join sysroleoption ONsysoption.opti_id=sysroleoption.opti_id AND sysroleoption.role_id=:roleid'
但ACCESS中不能,只能
'Select distinctsysoption.opti_id,sysoption.opti_name,sysoption.opti_code,sysroleoption.opti_sortFrom sysoption inner join sysroleoption ONsysoption.opti_id=sysroleoption.opti_id Where sysroleoption.role_id=:roleid'
5、 Update语句
Sql SerVer 中能执行但Access中不能
'Update sysuserrole SET sysuserrole.role_sort = (Selectsysrole.role_sort FROM sysrole Where sysuserrole.role_id = sysrole.role_id andsysuserrole.user_id='01')'
6、日期比较
SQL SERVER 中用
StrSql:='selectcopy_year,Start_month,Cur_month,Start_Flag,Start_date,End_date '
+'From SysCopys '
+'where copy_id='''+LoginCopyID+''' '
+'and start_date<='''+datetostr(LoginDate)+''' '
+'and end_date>='''+datetostr(LoginDate)+'''';
ACCESS中用
StrSql:='selectcopy_year,Start_month,Cur_month,Start_Flag,Start_date,End_date '
+'From SysCopys '
+'where copy_id='''+LoginCopyID+''' '
+'and start_date<=#'+datetostr(LoginDate)+'# '
+'and end_date>=#'+datetostr(LoginDate)+'#'
参考以上的第10个函数“GetDateStr”
7、最大数值获取语句
StrSql:='insert into sysRoleOption '
+'select '''+fidRoleId+''' as Role_ID,opti_id,'
+'convert(numeric,opti_id)-(convert(numeric,opti_parentid)*100)+'+MaxOptiSort
+' as opti_Sort from sysoption where opti_parentid='''
+PCoTypeID(self.trvRoles.Selected.data)^.StrCoTypeID
+''' and opti_bottom=''1'+'''';
改为
StrSql:='insert into sysRoleOption '
+'select '''+fidRoleId+''' as Role_ID,opti_id,'
+'opti_id-opti_parentid*100+'+ MaxOptiSort
+' as opti_sort from sysoption where opti_parentid='''
+PCoTypeID(self.trvRoles.Selected.data)^.StrCoTypeID
+''' and opti_bottom=''1'+''''
注:两种写法都能在SQL-SERVER中运行,但第一种在ACCESS中不能运行
但是考虑会出现Null值以及语句的通用性,可以使用以上的第07个函数“GetNullStr”和第09个函数“GetConvertStr”来完成字符串向数字,空值和0数字的转换:参考GetNextNumStr代码。
1、Sql中不能省略as
2、一次只能执行一条Sql
3、没有substring、cast等函数
4、sql中严格区分整形和字符型
5、没有存储过程、触发器
6、!=
替换为<>
7、时间字符串两边加#号
8、带参数的sql语句中 @用?号替换
浙公网安备 33010602011771号