天天看點

access 和SQL有什麼不同

Access中提供查詢對象,在設計時可以采用設計視圖和SQL視圖,非常友善,SQL視圖中的SQL語句可以在SQL SERVER中使用,但是否完全可用呢?答案是否定的,表1中總結了 Microsoft Access 和 Microsoft SQL Servers 的 SQL 文法的重要差別。

web配置 <add name="ConnString" connectionString="~/App_Data/aa.mdb" />

help幫助類 private static readonly string ConnectionString = ("Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + HttpContext.Current.Server.MapPath(ConfigurationManager.ConnectionStrings["ConnString"].ToString()));

操作資料庫時sql變成了OleDb

表1

SQL 文法元素

Microsoft

Access

Microsoft SQL

Server

辨別符

限制不超過 64 個字元。

允許使用關鍵字和特殊字元。

可以用任何字元開頭。

SQL Server 6.5:

限制不超過 30 個字元。

不允許使用關鍵字和特殊字元。

必須用字母字元開頭。

SQL Server 7.0 的辨別符與 Access 完全相容。

輸出字段

允許多個輸出字段具有相同名稱。

在視圖中不支援多個相同輸出字段名。

日期分隔符号

英鎊符(#)

撇号(’)

Boolean 常量

True、False;On、Off;Yes、No。

整數:1(真)、0(假)

字元串連接配接

和号(&)

加号(+)

通配符

星号(*)與零個或更多字元比對。

問号(?)與單個字元比對。

歎号(!)意味着不在清單中。

英鎊符(#)意味着單個數字。

百分号(%)與零個或更多字元比對。

下劃線(_)與單個字元比對。

上插入符(^)意味着不在清單中。

沒有與英鎊符(#)對應的字元。

TOP

如果有一個 ORDER BY 子句,自動包含層次。

SQL Server 6.5 不支援。

SQL Server 7.0 需要一個明确的 WITH TIES 子句。

CREATE INDEX

允許建立升序和降序索引。

允許聲明主鍵,沒有 Null 值,并且忽略 Null 值。

DROP INDEX

文法是:

Drop Index <index name> ON <table name>

文法是:

Drop Index <table name>, <index name>

DISTINCTROW

支援(允許選擇單個記錄)。

不支援。

OWNERACCESS

支援(在執行時控制許可權)。

不支援。

Table in UNION

支援(允許使用下列文法指定表:

TABLE <tablename>

不支援。

ORDER BY in Unions

支援。允許通過聯合查詢中的子句實作多種排序。

支援。允許通過語句末尾的子句實作一種排序。

TRANSFORM

支援。用于交叉表查詢。

不支援。

PARAMETERS

支援(在 SQL 中記錄)。

不支援。

以northwind資料庫為例,若要得到相同查詢結果,SQL語句作相應變化。

Access:

SELECT * FROM Products where productname like ’c*’;

SELECT * FROM Products where productname like ’c?ang’;

SQL Server:

SELECT * FROM Products WHERE productname LIKE ’c%’

SELECT * FROM Products WHERE productname LIKE ’c_ang’

在開發過程中尤其需要注意通配符的變化。

===============================================

一. 基礎概念

可以使用的資料類型如下:

1.      TEXT:文本型(指定長度時),備注型(不指定長度時);

2.      CHAR,NCHAR,VARCHAR,NVARCHAR:文本型,可以指定長度,否則預設值為255!

3.      BYTE,TINYINT:數字-位元組,不要指定長度和精度,否則會報錯!

4.      SMALLINT,SHORT:數字-整型,不要指定長度和精度,否則會報錯!

5.      INT,INTEGER,LONG:數字-長整型,不要指定長度和精度,否則會報錯!

6.      NUMERIC,DECIMAL:數字-小數,可以指定長度和精度,如隻指定長度,那精度預設為0,如都不指定,那麼預設長度18,預設精度0;

7.      SINGLE,REAL:數字-單精度型,不要指定長度和精度,否則會報錯!

8.      DOUBLE,FLOAT,NUMBER:數字-雙精度型,不要指定長度和精度,否則會報錯!

9.      MEMO:備注型,不要指定長度,否則會報錯!

10. BINARY:二進制型,可以指定長度,否則預設長度為510!

11. BIT:位型,可用格式(yes/no, true/false, on/off)

12. MONEY,CURRENCY:貨币型,不要指定長度和精度,否則會報錯!

13. DATETIME:日期時間型,不要指定長度,否則會報錯!

14. IMAGE,OLEOBJECT: OLE OBJECT型,不要指定長度,否則會報錯!

推薦使用的資料類型如下:

1.        文本類型請使用:TEXT(長度)或 MEMO

2.        數值類型(整數)請使用:SHORT 或 LONG

3.        數值類型(小數)請使用:DECIMAL(長度,精度)

4.        日期類型請使用:DATETIME

參考如下MICROSOFT官方資料:

資料類型        存儲大小              說明

BINARY        每字元一個位元組      任何類型的資料都可存儲在這種類型的字段中。

BIT              1 個位元組               Yes/No(TURE/FALSE, ON/OFF,-1/0)隻包含兩值之一的字段。

TINYINT        1 個位元組               介于 0 到 255 之間的整型數。

MONEY          8 個位元組              介于 – 922,337,203,685,477.5808 到922,337,203,685,477.5807 之間。

DATETIME     8 個位元組               介于 100 到 9999 年的日期或時間數值。

UNIQUEIDENTIFIER     128 個位 用于遠端過程調用的唯一識别數字。

REAL             4 個位元組              單精度浮點數

FLOAT            8 個位元組             雙精度浮點數

SMALLINT     2 個位元組               介于–32,768 到 32,767 的短整型數。

INTEGER        4 個位元組             介于–2,147,483,648 到 2,147,483,647 的長整型數。

DECIMAL       17 個位元組            你可以定義精度 (1 - 28) 和符号 (0 - 定義精度)。預設精度和符号分别是18和0。

TEXT           每字元2位元組            從0到最大2,14GB位元組。

IMAGE         視實際需要而定        從0到最大2,14GB位元組。用于 OLE 對象。

CHARACTER   每字元2位元組          長度從 0 到 255個字元。

二. DDL

1.建立表:

1)CREATE TABLE XCUST (CUSTNO SHORT NOT NULL,CUSTNAME TEXT(40) NOT NULL,ADDRESS TEXT(60),PRICE DECIMAL(15,4) NOT NULL,SITE DATETIME,TELNO TEXT(30),FAXNO TEXT(30))

2)SELECT * INTO XCUST2 FROM XCUST WHERE CITY NOT LIKE ’中國江西九江’

2.修改表:

1)增加列:ALTER TABLE XCUST ADD COLUMN CITY TEXT(30)

2)删除列:ALTER TABLE XCUST DROP COLUMN CITY

3)修改列:ALTER TABLE XCUST ALTER COLUMN CITY TEXT(40)

三. DML

1.插入資料:

1)INSERT INTO XCUST (CUST, CITY) VALUES (‘0659’, ’中國上海’)

2)INSERT INTO XCUST VALUES (‘0619’, 18, ’2007-09-22’, ’中國南京’)

3)INSERT INTO XCUST SELECT * FROM XCUST1 WHERE CITY LIKE ‘美國%’

2.修改資料:

1)改日期:UPDATE XCUST SET NDATE='2007/07/17' WHERE CUST='0659'

2)改數值:UPDATE XCUST SET CAGE=33 WHERE CUST='0659'

3)改文本:UPDATE XCUST SET CUST=’0699’ WHERE CUST='0659'

四. 字元串比較中使用通配符

僅當使用 Microsoft® Jet 4.X 版和 Microsoft OLE DB Provider for Jet 時,ANSI SQL 通配符 (%) 和 (_) 才可用。若使用 Microsoft Access 或 DAO,則将其視為原義字元。

在樣式中的字元        在表達式中的比對

? or _(下劃線)       任何單一字元

* or %                    零個或多個字元

#                            任何單一數字(0 — 9)

[字元清單]                 任何在字元清單中的單一字元

[!字元清單]                任何不在字元清單中的單一字元

用括在括号 ([ ]) 中的一組字元(字元表)來比對表達式中任何的單一字元,而且字元表中幾乎可以包含 ANSI 字元集中的任何字元,包括數字。事實上特殊字元,如左括号 ([ )、問号(?)、井字号(#)和星号(*),當它們括在括号内時,可以直接和它們自己比對。一組字元内的右括号 ( ]) 不能比對它自己,但是如果它是一組之外的單一字元,就能用來比對。除了括在括号内的字元的簡單表列,字元表可以指定一字元範圍,用連字元号 (-) 來隔開範圍的上下界。例如,在樣式中使用 [A-Z] ,可在包含從 A 到 Z 的任何大寫字母的表達式内,找出相應的字元位置。可以在括号之中包含多個範圍且不需要在範圍間劃上界線。例如,[a-zA-Z0-9] 指任何符合文數值的字元。

樣式比對的重要的規則還有:

•在字元表開頭的驚歎号(!),意味着在表達式中尋找那些不包括在字元表中的字元。若驚歎号(!)在括号之外,它隻比對它自己。

•如果連字元(-)在字元表的開頭(如果有驚歎号,則緊跟在驚歎号之後),或在字元表的末尾,則它比對連字元(-)自己。否則它被視為 ANSI 字元範圍的辨別。

•當您指定一個字元範圍時,首尾字元必須以升序的順序出現(A-Z 或 0-100)。例如,[A-Z] 是有效的,而 [Z-A] 則無效。

•字元順序 [ ] 忽略不計,被看作零長度字元串 (“”)。

====Access與Sql Server之ASP代碼比較==================================================

背景資料庫:

[Microsoft Access]

[Microsoft Sql Server]

更換之後,ASP代碼應注意要修改的一些地方:

[一]連接配接問題(舉例)

[Microsoft Access]

constr = "DBQ=c:/data/clwz.mdb; DRIVER={Microsoft Access Driver (*.mdb)}"

[Microsoft Sql Server]

constr = "DRIVER={SQL Server};SERVER=host;DATABASE=mydata;uid=sa;pwd="

[二]相似函數(舉例)

[1]DATEDIFF(datepart, startdate, enddate)

其中“datepart”參數可選項如下:

設定 描述

————————————

[Microsoft Access]

年 yyyy

季度 q

月 m

一年的日數 y

日 d

一周的日數 w

周 ww

小時 h

分鐘 n

秒 s

[Microsoft Sql Server]

year yy, yyyy

quarter qq, q

month mm, m

dayofyear dy, y

day dd, d

week wk, ww

hour hh

minute mi, n

second ss, s

millisecond ms

-------------------------

基本上差不多,但注意的是在寫的時候,

[Microsoft Access]要加引号,如:datediff('d',enddate,'2004/08/01')

[Microsoft Sql Server]則不需要,如:datediff(d,enddate,'2004/08/01')

[2][Microsoft Access]中可用如cstr等轉資料類型函數,而

[Microsoft Sql Server]中則用convert或cast函數,如:

convert(varchar,[amount])等。

[3][Microsoft Sql Server]

取目前時間用getdate等等...

[三]語句

[Microsoft Sql Server]

可以用

CASE

WHEN THEN

WHEN THEN

...

ELSE

END

語句,而

[Microsoft Access]

不支援。

[Microsoft Access]也不支援between語句

[Microsoft Sql Server]則可以這樣寫:

[date] between @date1 and @date2

[四]查詢表

[Microsoft Sql Server]

可三個及以上表join查詢,而

[Microsoft Access]

好像隻能兩個表聯接查詢(待權威确認),

而且[Microsoft Sql Server]可用“*=”和“=*”連接配接符。[五]除零問題

[Microsoft Access]

在碰到除數為零時,自動丢掉相關記錄,而

[Microsoft Sql Server]

則會報錯,且查詢中止。删除代碼:

[Microsoft Access]

可以這樣寫:delete * from [table]

[Microsoft SQL Server]

隻能這樣寫:delete from [table]

多*會報錯

_____________________________________

目前日期:

[Microsoft Access]

用date()

[Microsoft SQL Server]

用getdate()如果資料庫可能會更換類型的話,可以

在ASP代碼中加上如這樣:

if inStr(constr,"Microsoft Access") > 0 then

sqlstr=[Microsoft Access][sql代碼]

else

sqlstr=[Microsoft Sql Server][sql代碼]

end if

(constr--連接配接字元串)

這樣即使改了資料庫,也不用改資料庫查詢更新代碼了。

再加:access中有true、false的字段記錄,而sql裡隻有smallint,對應如果在access裡有“字段名=true”的,在sql裡要改成“字段名=1”

網上大部分的免費asp程式使用的是access資料庫。但是access資料庫作為一個中小型的單機資料庫系統,在承擔通路量、資料量大的網站應用時,往往就不堪重負了。一般認為,超過50M的access資料庫性能就開始明顯下降,超過100M以後,出錯、運作慢的問題會更加突出。盡管可以如動網7.0以後那樣,從程式的角度盡量優化以圖提高性能,但是不能從根本上解決問題。

這時也許使用微軟的SQL Server資料庫就是最可能的辦法,當然也可以使用其它的如Oracle、MySQL等等,但是作為改寫來說,由于同為微軟的産品,改寫成SQL Server應該是最省力的辦法。

一、改寫前提:

系統已經安裝好SQL Server2000并且打上了SP3更新檔;安裝好Office套件裡面的Access;使用一個支援純文字編輯并且帶有行号顯示的編輯器,推薦Ultra Edit,當然也可以使用FrontPage2003,不過以前的版本行号顯示不太好用。

個人能力要求:會基本的asp文法、access資料庫的操作、SQLServer企業管理器的基本操作。

二、資料庫的準備

一般來說有兩種情況:

1、程式提供了SQL資料庫格式:有一個MDF檔案,或者提供了建立SQL資料庫的SQL腳本檔案(字尾名為.sql)。

如果有mdf檔案,可以用企業管理器直接附加上,如果提供的是sql腳本檔案,那麼就先用企業管理器自己建立一個sql資料庫,然後資料庫用企業管理器中的查詢分析器運作這個腳本建立資料庫表。

這樣建立的資料庫基本不用再去改寫什麼了。

2、更多的是沒有提供SQL資料庫或腳本檔案的,這時,就要自己來做這一切了,這也是我們這個文章主要解決的問題。一般這樣的程式會提供一個access資料庫,這樣你就用企業管理器導入access資料庫,導入後需要改寫下面一些東西:

對照原來的access,改寫下面的部分:

(1)sql資料庫表是沒有自動字段的,是以原來access中的自動字段被轉換成了普通字段,需要手工改成辨別類型,增量為1。

(2)所有的時間字段,如果定義了預設值,那麼原來肯定是now(),需要改成getdate()

(3)原來字段的預設值一般都不會自動引入,需要對照原表的字段手工添加。

(4)由于資料庫的不同,access和sql的字段類型很多轉換後就變化了,比如原來的《是否》字段會被轉換成bit或者int,備注字段被轉換成longtext,text字段轉換成varchar等等,一般來說不會影響程式運作,如果有問題,我們在下面的程式改寫部分再說。

(5)如果你要用一個For SQL的程式,裡面用到了存儲過程,那麼你應該有這個程式本身建立SQL資料庫的方法:有其本身的SQL資料庫檔案,或者sql腳本;如果沒有的話,采用導入access資料庫的方式是無法建立存儲過程的,這樣你最好放棄這個For SQL的程式版本,使用同樣版本的For Access的程式,導入access資料庫,然後用下面的改寫方法自己改成SQL版本的程式。

三、連接配接字元串的改寫

可參考動網的這段,分别是針對access和SQL的

Dim ConnStr

If IsSqlDataBase = 1 Then

'sql資料庫連接配接參數:資料庫名、使用者密碼、使用者名、連接配接名(本地用local,外地用IP)

Dim SqlDatabaseName,SqlPassword,SqlUsername,SqlLocalName

SqlDatabaseName = "dvbbs7"

SqlPassword = ""

SqlUsername = "dvbbs"

SqlLocalName = "(local)"

ConnStr = "Provider = Sqloledb; User ID = " & SqlUsername & "; Password = " & SqlPassword & "; Initial Catalog = " & SqlDatabaseName & "; Data Source = " & SqlLocalName & ";"

Else

'免費使用者第一次使用請修改本處資料庫位址并相應修改data目錄中資料庫名稱,如将dvbbs6.mdb修改為dvbbs6.asp

'http://www.knowsky.com/

Db = "data/fengerqingqing.mdb"

ConnStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & Server.MapPath(db)

End If

On Error Resume Next

Set conn = Server.CreateObject("ADODB.Connection")

conn.open ConnStr

當然你使用SQL的話,有關access的使用語句可以删除,就是else後面到on error resume next前面,變成這樣:

Dim ConnStr

'sql資料庫連接配接參數:資料庫名、使用者密碼、使用者名、連接配接名(本地用local,外地用IP)

Dim SqlDatabaseName,SqlPassword,SqlUsername,SqlLocalName

SqlDatabaseName = "dvbbs7"

SqlPassword = ""

SqlUsername = "dvbbs"

SqlLocalName = "(local)"

ConnStr = "Provider = Sqloledb; User ID = " & SqlUsername & "; Password = " & SqlPassword & "; Initial Catalog = " & SqlDatabaseName & "; Data Source = " & SqlLocalName & ";"

On Error Resume Next

Set conn = Server.CreateObject("ADODB.Connection")

conn.open ConnStr

也可以簡潔一些,寫成這樣:

Set conn = Server.CreateObject("ADODB.Connection")

conn.open "Provider = Sqloledb; User ID = sa; Password = 1234567; Initial Catalog = dvbbs7; Data Source = (local);"

裡面的資料庫名稱、資料源、使用者、密碼根據自己的實際情況改寫一下。

四、程式的改寫

這也有兩種情況

1、如果你幸運,拿到的是For SQL的程式,那麼如果上面的資料庫建立過程沒有遇到麻煩,程式基本上就可以運作了,出錯的話,隻是程式本身的bug,如何修改不是這個文章讨論的内容,就不贅述了。

2、大多數情況,程式本身是For Access的,與For SQL的程式差别主要是程式中使用到的SQL查詢語句。注意,SQL查詢語句是資料庫應用不可缺少的部分,不管是For SQL還是For Aceess的程式使用的文法大體差不多,但是有一些微妙的差别,正是這些差别,造成了程式的不通用,也是我們需要修改的主要内容。這樣一般要修改的部分如下:

(1)時間函數的問題:SQL資料庫的時間函數與access不同,最常見的是取現在時間的函數,access是now(),SQL是getdate()。是以凡是在where子句中使用了now()的地方都要改成getdate();注意,now()函數在asp程式本身也要使用,凡是不在資料庫查詢或執行語句中使用的now()函數千萬不要改。

(2)時間比較函數:datediff('d','時間1',‘時間2’)這是access查詢用的格式,SQl中這些引号都要去掉,同時時間格式的前後可能加上了#,這也要去掉。同樣這也是指在sql語句中的,在asp語句中的要保持原樣。

(3)空值的表示:在access中,判斷空值一般用是否=""來表示,但是這在SQL中往往出錯,如果遇到出錯的問題或者程式運作不正常,可以改成如這樣判斷:where (name is null)

(4)真假值判斷:access中可以用=true、=false來判斷,但是在SQL中就會出錯,是以在SQL查詢或執行語句中這類判斷要分别改成=1、=0。注意一點:有些程式雖然寫成=“true”,但是由于有引号,是以這個字段是字元類型的,你不能改成=1,保持原樣即可。

以上是比較常見的改寫的地方,還有一些不太常見,如果遇到了可以在此回帖讨論。

五、程式的調試

前面推薦使用帶有行号的編輯器,是因為上述的改寫不大可能是直接搜尋程式源碼來做,很難找全。

我采取的方式一般這樣:資料庫改寫完成,直接調試程式,出錯後,看看出錯的提示,找到相應檔案的代碼行,但是根源往往不是那行,比如出錯的語句是:conn.execute(sql),但是這句本身是沒有錯的,錯誤原因是裡面的這個sql字元串,那就向上看這個sql字元串是如何生成的,按照上面所說的程式修改辦法修改。

資料庫導入以後,自動增加字段需要重寫,所有的數字類型需要增加長度,最好用decimal。

所有的預設值都丢失了。主要是數字類型和日期類型。

所有now(),time(),date()要改成getdate()。

所有datediff('d', time1, time2)要改成datediff(day, time1, time2)

有可能一些true/false類型不能使用,要變為1/0。

備注類型要通過cast(column as varchar)來使用。

CursorType要改成1,也就是打開資料庫時要給出第一個數字參數為1,否則記錄可能顯示不完整。

isnull(rowname)要改成rowname = null

ACCESS的資料庫中的自動編号類型在轉化時,sql server并沒有将它設為自動編号型,我們需在SQL建立語句中加上identity,表示自動編号!

轉化時,跟日期有關的字段,SQL SERVER預設為smalldatetime型,我們最好将它變為datetime型,因為datetime型的範圍比smalldatetime型大。有時用smalldatetime型時,轉化失敗,而用datetime型時,轉化成功。

對此兩種資料庫進行操作的sql語句不全相同,例如:在對ACCESS資料庫進行删除紀錄時用:"delete * from user where id=10",而對SQL SERVER資料庫進行删除是用:"delete user where id=10".

日期函數不相同,在對ACCESS資料庫進行中,可用date()、time()等函數,但對SQL SERVER資料庫進行中,隻能用datediff,dateadd等函數,而不能用date()、time()等函數。

在對ACCESS資料庫進行中,sql語句中直接可以用一些VB的函數,像cstr()函數,而對SQL SERVER資料庫進行中,卻不能用。

下表比較了MicrosoftAccess資料庫(MicrosoftAccess資料庫:資料和對象(如表、查詢或窗體)組成的集合,與特定的主題或用途有關。MicrosoftJet資料庫引擎用于管理資料。)和MicrosoftAccess項目(MicrosoftAccess項目:與MicrosoftSQLServer資料庫連接配接且用于建立客戶/伺服器應用程式的Access檔案。項目檔案中不包含任何資料或基于資料定義的對象(如表或視圖)。)的資料類型(資料類型:決定字段可擁有的資料類型的字段特征。資料類型包括Boolean、Integer、Long、Currency、Single、Double、Date、String和Variant(預設))。

MicrosoftAccess資料類型SQLServer資料類型

是/否(“是/否”資料類型:一種字段資料類型,用于隻有兩種可能值(如是或否、True或False)的字段。不允許有Null值。)bit(bit資料類型:在Access項目中,一種存儲值為1或0的資料類型。接受1和0以外的整數值,但總是将其解釋為1。)

數字(“數字”資料類型:MicrosoftAccess資料庫中的一種字段資料類型,用于将在數學運算中使用的數值資料。但是,若要顯示或計算貨币值,則應使用“貨币”資料類型。)(位元組)tinyint(tinyint資料類型:Access項目中的一種占一個位元組(8位)的資料類型,用于存儲從0到255範圍内的整數。)

數字(整型)smallint(smallint資料類型:Access項目中的一種2位元組(16位)資料類型,存儲位于-2^15(-32,768)與2^15-1(32,767)之間的數字。)

數字(長整型)int(int資料類型:Access項目中的一種4位元組(32位)資料類型,存儲位于-2^31(-2,147,483,648)與2^31-1(2,147,483,647)之間的數字。)

數字(單精度浮點型)real(real資料類型:在Access項目中,一種近似的數值資料類型,精度為7位,正值取值範圍大緻從1.18E-38到3.40E+38,負值取值範圍大緻從-1.18E-38到-3.40E+38,也可以取0。)

(無等價的資料類型)bigint(bigint資料類型:Access項目中的一種8位元組(64位)資料類型,存儲位于-2^63(-9,223,372,036,854,775,808)與2^63-1(9,223,372,036,854,775,807)之間的數字。)

數字(雙精度浮點型)float(float資料類型:在Access項目中,一種近似的數值資料類型,精度為15位。它所存儲的正值範圍大緻是從2.23E-308到1.79E+308,負值範圍大緻是從-2.23E-308到-1.79E+308,也可以為0。)

貨币(“貨币”資料類型:MicrosoftAccess資料庫中的一種資料類型,用于與貨币有關的計算或其精确度極其重要的定點計算。)money(money資料類型:在Access項目中,用于存儲貨币值的資料類型,取值範圍從-922,337,203,685,477.5707到922,337,203,685,477.5807,精确度為萬分之一個貨币機關。)

smallmoney(smallmoney資料類型:Access項目中的一種存儲貨币值的資料類型,取值範圍從-214,748.3648到214,748.3647,精确度為萬分之一個貨币機關。當顯示smallmoney值時,會将它們四舍五入為兩個小數位。)

小數/數值(decimal資料類型(Access資料庫):精确的數值資料類型,用于存儲-10^38-1到10^38-1的值。可以指定數值範圍(最大總位數)和精度(小數點右邊的最大位數)。)decimal(decimal資料類型(Access項目):精确的數值資料類型,用于存儲-10^38-1到10^38-1的值。可以指定數值範圍(最大總位數)和精度(小數點右邊的最大位數)。)

numeric(numeric資料類型:在Access項目中,一種精确的數值資料類型,取值從-10^38-1到10^38-1。可以指定數值範圍(最大總位數)和精度(小數點右邊的最大位數)。)

日期/時間(“日期/時間”資料類型:Access資料庫的一種資料類型,用來存放日期和時間資訊。)datetime(datetime資料類型:在Access項目中,日期和時間的資料類型,範圍從1753年1月1日到9999年12月31日,精确度為三百分之一秒,即3.33毫秒。)

smalldatetime(smalldatetime資料類型:Access項目中的一種日期和時間資料類型,精度不如datetime時間資料類型。資料取值範圍從1900年1月1日到2079年6月6日,精确度為一分鐘。)

自動編号(“自動編号”資料類型:MicrosoftAccess資料庫中的一種字段資料類型,當向表中添加一條新記錄時,這種資料類型會自動為每條記錄存儲一個唯一的編号。可以産生三種編号:順序号、随機号和同步複制ID。)(遞增)int(int資料類型:Access項目中的一種4位元組(32位)資料類型,存儲位于-2^31(-2,147,483,648)與2^31-1(2,147,483,647)之間的數字。)(定義了Identity屬性)

文本(“文本”資料類型:MicrosoftAccess資料庫中的一種字段資料類型。“文本”資料類型最多可以包含255個字元,或者是由FieldSize屬性指定的一個小一些的字元數。)(n)varchar(n)(varchar(n)資料類型:Access項目中的一種可變長度的資料類型,最大長度為8,000個ANSI字元。)

nvarchar(n)(nvarchar(n)資料類型:在Access項目中,一種可變長度的資料類型,最多可含4,000個Unicode字元。Unicode字元每字元占兩個位元組,而且支援所有國際字元。)

備注(“備注”資料類型:在MicrosoftAccess資料庫中的一種字段資料類型。“備注”字段最多可以包含65,535個字元。)text(text資料類型:Access項目中的一種長度可變的資料類型,最多可存儲2^31-1(2,147,483,647)個字元;預設長度為16。)

OLE對象(“OLE對象”資料類型:字段的資料類型之一,用于在其他應用程式中建立的、可連結或嵌入(插入)到Access資料庫中的對象。)image(image資料類型:在Access項目中,一種長度可變的資料類型,最多可存儲2^31-1(2,147,483,647)位元組的二進制資料。image資料類型用來存儲BLOB(二進制大對象),如圖檔、文檔、聲音和已編譯代碼。)

同步複制ID(又名全局唯一辨別符(GUID:在Access資料庫中,一種用于建立同步複制唯一辨別符的16位元組字段。GUID用于辨別副本、副本集、表、記錄和其他對象。在Access資料庫中,GUID是指同步複制ID。)(GUID))uniqueidentifier(uniqueidentifier資料類型:在Access項目中,16位元組的全局唯一辨別符(GUID)。)(僅适于SQLServer7.0或更高版本)

超連結(“超連結”資料類型:存儲超連結位址的Access資料庫字段的資料類型。位址最多可以包含四部分,用以下文法格式編寫:displaytext#address#subaddress#。)char(char資料類型:在Access項目中,一種固定長度的資料類型,最多可含8,000個ANSI字元。),

nchar(nchar資料類型:在Access項目中,一種固定長度的資料類型,最多可含4,000個Unicode字元。Unicode字元每字元占兩個位元組,而且支援所有國際字元。),varchar,nvarchar(Hyperlink屬性設為Yes)

(無等價的資料類型)varbinary(varbinary資料類型:Access項目中的一種可變長度的資料類型,最多可存儲8,000位元組的二進制資料。)

(無等價的資料類型)smallint(smallint資料類型:Access項目中的一種2位元組(16位)資料類型,存儲位于-2^15(-32,768)與2^15-1(32,767)之間的數字。)

(無等價的資料類型)timestamp(timestamp資料類型:在Access項目中,一種每插入或更新一行就會自動更新的資料類型。timestamp列中的值不是datetime資料,而是binary(8)或varbinary(8),标明了資料修改的順序。)

(無等價的資料類型)charnchar

(無等價的資料類型)sql_variant(sql_variant資料類型:Access項目中的一種資料類型,存儲除text、ntext、image、timestamp和sql_variant類型以外的多種資料類型的值。在列、參數、變量或使用者定義函數的傳回值中使用。)

(無等價的資料類型)使用者定義(使用者定義的資料類型:在MicrosoftSQLServer資料庫中,允許某列包含的資料的類型定義,由使用者利用現有的系統資料類型定義。規則和預設值僅可以綁定到使用者定義的資料類型。)

注釋在Access項目或SQLServer資料庫中,字首“n”代表“國家/地區”,意思是這個資料類型是啟用Unicode的。在Access資料庫中,全部文本列在預設情況下都是啟用Unicode的。

ACCESS轉SQL需要注意的問題

2006-2-13 16:01:20

很多朋友想用SQL2000資料庫的程式設計方法,但是卻又苦于自己是學ACCESS的,對SQL隻是一點點的了解而已,這裡我給大家提供以下參考---将ACCESS轉化成SQL2000的方法和注意事項

一,首先,我說的是在ACCESS2000,SQL2000之間轉換,其他的我也還沒有嘗試過,希望大家多多試驗,肯定是有辦法的;

二,轉換的方法

1,打開”控制台“下”管理工具“中的”資料庫源“;

2,按”添加“添加一個新的資料源,在選擇欄裡選”DriverdomicrosoftAccess

(*.mdb)”,完成後将出現一個框,

在”資料庫源“裡面輸入你想寫的名稱,我取名叫“ABC”,說明不需要填,接着,按下面的選擇,尋找你的資料庫位址和選中(注意,請先備份自己的ACCESS資料庫),然後确定。

資料源在這裡建好了,剩下轉換了。

3,打開SQL2000企業管理器,進入資料庫,建立一個空的資料庫“ABC”;

4,選擇建立立的資料庫,按滑鼠右鍵,選擇“所有任務”下“導入資料”,按“下一步”繼續;

5,在資料庫源下拉但中選擇”DriverdomicrosoftAccess(*.mdb)“,在”使用者/系統DSN“中,選種你剛才添加的”ABC“,按”下一步“;

6,“目的”不需要修改,選擇伺服器(一般下為自己的本機"local",也可以選擇伺服器位址或者區域網路位址,确定你的權限是否可以操作,),"使用WINDOWS身份驗證"指用自己的系統管理者身份操作,"使用SQL身份操作驗證"可以用于網站的操作,推薦用後者;

7,選上"使用SQL身份操作驗證"後,填寫你的使用者名和密碼,我自己選擇的是系統預設号碼"sa","****",資料庫選擇剛建立的"ABC",按"下一步";

8,這一步的兩個單項選擇,"從資料源複制表和視圖"與"用一條查詢指令指定要傳輸的資料",選擇前者,按"下一步"繼續;

9,這裡将出現你自己ACCESS資料庫的表,按"全選"後,下一步;

10,"DTS導入/導出向導",看"立即運作"被選中按"下一步",

11,按"完成"繼續;

12,這個步驟你将看到你的資料被導入SQL2000裡面,當出現"已經成功把XXX個表導入到資料庫"的字樣,而且所有的表前面都有綠色的勾,就表示成功導入所有資料,如果中途出現問題或者表前面有紅色的*的話,說明該表沒有成功導入,這時就要回去檢視自己的操作是否正确了.

三,資料修改

1,由于SQL2000裡面沒有"自動編号",是以你的以"自動編号"設定的字段都會變成非空的字段,這就必須手工修改這些字段,并把他的"标示"選擇"是",種子為"1",增量為"1",

2,另外,ACCESS2000轉換成SQL2000後,原來屬性為"是/否"的字段将被轉換成非空的"bit",這時候你必須修改成自己想要的屬性了;

3,另外,大家要注意對時間函數的把握.ACCESS與SQL是有很多不同的.

四、相關的字段問題

1.ACCESS的資料庫中的自動編号類型在轉化時,sqlserver并沒有将它設為自動編号型,我們需在SQL建立語句中加上identity,表示自動編号!

2.轉化時,跟日期有關的字段,SQLSERVER預設為smalldatetime型,我們最好将它變為datetime型,因為datetime型的範圍比smalldatetime型大。我遇見這種情況,用smalldatetime型時,轉化失敗,而用datetime型時,轉化成功。

3.對此兩種資料庫進行操作的sql語句不全相同,例如:在對ACCESS資料庫進行删除紀錄時用:"delete*fromuserwhereid=10",而對SQLSERVER資料庫進行删除是用:"deleteuserwhereid=10".

4.日期函數不相同,在對ACCESS資料庫進行中,可用date()、time()等函數,但對SQLSERVER資料庫進行中,隻能用datediff,dateadd等函數,而不能用date()、time()等函數。

5.在對ACCESS資料庫進行中,sql語句中直接可以用一些VB的函數,像cstr()函數,而對SQLSERVER資料庫進行中,卻不能用。

五、相關語句問題

自動增加字段需要重寫。在access中經常使用的自動編号字段,導入到mssql後,他并不是自增型的int,需要手工設定,把導入後的自動編号字段的辨別的“否”改為“是”,“種子”和“遞增量”都為“1”,才能成為自動編号

所有的預設值都丢失了。主要是數字類型和日期類型

所有now(),time(),date()要改成getdate()

所有datediff('d',time1,time2)要改成datediff(day,time1,time2)

所有datediff('ww',time1,time2)要改成datediff(week,time1,time2)

所有datediff('d',time1,time2)要改成datediff(day,time1,time2)

在mssqlserver中,有許多保留字,在access中是沒有的,當你把資料導入到mssql的時候,問題就出來了。mssql在導入的時候,會自動給這些字段(包括資料庫中的表名)加上“[字段名]”,是以,你必須修改你的腳本,把相應的字段名字(或者表名字)加上中括号,或改變字段名字為不是mssql的保留字

在用access關于時間的使用,大家喜歡使用“select*fromaaaawhiletime="&now()”這樣的sql語句,然而,在mssql中沒有“now()”這個函數,而是使用“getdate()”,是以,所有的sql語句中的“now()”必須換成“getdate()”。

日期函數不相同,在對ACCESS資料庫進行中,可用date()、time()等函數,但對

SQLSERVER資料庫進行中,隻能用datediff,dateadd等函數,而不能用date()、time()等函數。

轉化時,跟日期有關的字段,SQLSERVER預設為smalldatetime型,我們最好将它變為datetime型。