Access和sql server的语法区别

来源:互联网 发布:微信2级分销 源码下载 编辑:程序博客网 时间:2024/05/17 09:23

一、有区别的函数及解决方案
以下所示的解决方案中的函数定义在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

DeCodeCase

IIF

GetCaseStr

09

字段类型转换

Strvar….

Convertcast

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

二、AccessSQLSERVER部分相同数据库函数及关键字列表

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_idACCESS中不能运行

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代码。

1Sql中不能省略as
2
、一次只能执行一条Sql
3
、没有substringcast等函数
4
sql中严格区分整形和字符型
5
、没有存储过程、触发器
6
、!= 替换为<>
7
、时间字符串两边加#
8
、带参数的sql语句中 @?号替换

 

原创粉丝点击