Access与sql server的语法区别总结
下边列出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、 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) (select 200201,acc_id,acc_pid,acc_name,acc_short,acc_comment,acc_pro,acc_type,sub_id_flag,acc_index from pubsubjectacc where pubsubjectacc.co_type='03')
中后面"(select 200201******.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_index from pubsubjectacc where pubsubjectacc.co_type='03'
在sql server 中都可以
2、 inner join 语句1
strsql:='select a.user_id,a.user_opcode,b.copy_name from sysuser 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+''' and copy_name='''+tmpcopyname +'''';
应该改为
strsql:='select a.user_id,a.user_opcode,b.copy_name from sysuser 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+''' and copy_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 from syscopys a inner join syscopysuser b on a.curcopy_flag=1 and a.copy_id=b.copy_id where b.user_id=' + '''' +tmppubuserid+ '''';
该为
strsql:='select copy_year,copy_name,a.copy_id from syscopys a inner join syscopysuser b on a.copy_id=b.copy_id where a.curcopy_flag=''1'' and b.user_id=' + '''' +tmppubuserid+ '''';
注:两种写法都能在sql-server中运行,但第一种在access中不能运行
4、 inner join语句3
sql server 中可以执行以下语句
'select distinct sysoption.opti_id,sysoption.opti_name,sysoption.opti_code,sysroleoption.opti_sort from sysoption inner join sysroleoption on sysoption.opti_id=sysroleoption.opti_id and sysroleoption.role_id=:roleid'
但access中不能,只能
'select distinct sysoption.opti_id,sysoption.opti_name,sysoption.opti_code,sysroleoption.opti_sort from sysoption inner join sysroleoption on sysoption.opti_id=sysroleoption.opti_id where sysroleoption.role_id=:roleid'
5、 update语句
sql server 中能执行但access 中不能
'update sysuserrole set sysuserrole.role_sort = (select sysrole.role_sort from sysrole where sysuserrole.role_id = sysrole.role_id and sysuserrole.user_id='01')'
6、 日期比较
sql server 中用
strsql:='select copy_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:='select copy_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代码。
上一篇: 数据库设计的折衷方法
下一篇: 数据库正规化和设计技巧
推荐阅读
-
精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
-
精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
-
Sql server 中count() 与 sum() 的区别
-
sql server 2008 r2 express 精简版与企业版的区别
-
SQL Server 与MySQL中排序规则与字符集相关知识的一点总结
-
Access与sql server的语法区别总结
-
SQL SERVER 与ACCESS、EXCEL的数据转换
-
sql server与access中sql的一点区别
-
详解sql中exists和in的语法与区别
-
SQL SERVER 与ACCESS、EXCEL的数据转换