一、有區別的函數及解決方案
以下所示的解決方案中的函數定義在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代碼。