⑴ 我的access資料庫裡面sql語句在伺服器上不能正常運行
系統已經安裝好SQL Server2000並且打上了SP3補丁;安裝好Office套件裡面的Access;使用一個支持純文本編輯並且帶有行號顯示的編輯器,二、准備
1、程序提供了SQL資料庫格式:有一個MDF文件,或者提供了創建SQL資料庫的SQL腳本文件(後綴名為.sql)。
2、更多的是沒有提供SQL資料庫或腳本文件的,這時,就要自己來做這一切了,這也是我們這個帖子主要解決的問題。
對照原來的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 & ";"
Els
'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字元串是如何生成的,按照上面所說的程序修改辦法修改。
所有的默認值都丟失了。主要是數字類型和日期類型。
所有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資料庫處理中,卻不能用。
⑵ 如何查看在access2003中每一個查詢的可視化操作所轉換的sql語法
手工升級ACCESS到SQLSERVER
1、必須先安裝Microsoft Office Access 2003,和SQL Server2000。
2、把舊的資料庫備份,備份完成後,用Access 2003打開MDB資料庫,在打開時會出現一個警告,不要理會它(安全警告),按打開鍵,打開後激猛按工具欄——數明衫橋據庫實用工具——轉換資料庫——轉換為2002-2003格式,把資料庫轉換成2003格式。
3、轉換完成後再用Access 2003打開,打開後按工具欄——資料庫實用工具——升遷向導——新建資料庫——填寫SQL資料庫登陸名稱、密碼和要新建的塌缺資料庫(准備轉成新的資料庫),按下一步,按「 》」鍵,再按下一步,選取所有選項,再按下一步,選擇「不對應用程序作任何改動」,再按完成。
4、打開SQL企業管理器——資料庫---選中相應的資料庫---右鍵所有任務-----生成SQL腳本——常規——全部顯示——編寫全部對象腳本——確定(記住存放的位置)。
5、用記事本打開剛才生成的SQL腳本,在編輯欄——替換——查找內容為「datetime」替換為「smalldatetime」——替換全部;完成後再在編輯欄——替換——查找內容為「nvarchar」替換為「varchar」——替換全部,完成後保存退出。
6、打開SQL企業管理器——資料庫——點擊這個資料庫一下新建的資料庫,然後在工具欄——SQL查詢分析器——文件——打開——「剛才生成的SQL腳本」——查詢——執行,然後關閉窗口。 7、再回到SQL企業管理器——資料庫——點擊這個資料庫一下新建的資料庫,然後打開工具欄——資料庫轉換服務——導入數據——下一步——數據源「Microsoft Access」文件名「為舊的資料庫」——下一步——再下一步——從源數據復製表和視圖——下一步——全選——下一步——立即運行——下一步——完成
數據調整
隨著數據量的擴大,原先的Access已不堪重負,此時就應該考慮使用SQL Server、Oracle 等大型資料庫。由於Access和SQL Server 都是微軟自家產品,導入導出數據相對容易得多,所以從Access直接導入到SQL Server是一個比較好的方案。
具體的過程這里就不說了,大家都會的。我直接說一下將Access數據導入到SQL Server 中後,需要注意的幾點:
自動增加欄位需要重寫。在access中經常使用的自動編號欄位,導入到mssql後,他並不是自增型的int,需要手工設置,把導入後的自動編號欄位的標識的「否」改為「是」,「種子」和「遞增量」都為「1」,才能成為自動編號
所有的默認值都丟失了。主要是數字類型和日期類型。在ASP程序中now(),time(),date()要改成getdate()
有可能一些true/false的判斷語句不能正常使用了,這里是指用整數型來表達bool的情況,要變為1/0
在access的sql語句中的時間使用變數查詢的時候,大家一般使用」select * from aaaa while time=#」&變數名&」#」,在mssql中是不行的,他的語法是「select * from aaaa while time=』」&變數名&」『」」。
⑶ 在access中能不能輸入Insert之類的SQL句
可以的,在ACCESS裡面選擇新建查詢,切換到SQL視圖就可以輸入SQL語句,保存為一個查詢,隨時就可以運行它。
其實使用向導和設計建立的查詢也是一個SQL腳本,可以進行編輯和修改。
⑷ ACC轉SQL語句求助
大小寫也要注意!試試修改一下 40字元哪裡去掉試試
⑸ access 在哪裡可以運行sql腳本
打開ACCESS,當前顯示的是「表」,下面有個「查詢」,點擊之,然事看到右邊顯示「在設計視圖中創建查詢」,雙擊進入
然後會有一個「顯示表」的小彈窗,叉掉它,然後在「選擇查詢」的窗體中右鍵,就會顯示「SQL視圖」,這樣你就可以寫SQL直接運行了