office交流網(wǎng)--QQ交流群號(hào)及微信交流群

Access培訓(xùn)群:792054000         Excel免費(fèi)交流群群:686050929          Outlook交流群:221378704    

Word交流群:218156588             PPT交流群:324131555

微信交流群(請(qǐng)用微信掃碼)

        

Access傳遞查詢?cè)L問(wèn)Sql Server數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程(Store procedure)的詳細(xì)教程

2017-07-13 22:10:00
zstmtony
轉(zhuǎn)貼
7752
Access傳遞查詢?cè)L問(wèn)Sql Server數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程(Store procedure)的詳細(xì)教程

Access檢索和操作Sql Server數(shù)據(jù)有一種方法叫作pass-throught查詢,也就是所說(shuō)的傳遞查詢。傳遞查詢克服了jet數(shù)據(jù)庫(kù)扮演Access與Sql Server之間協(xié)同工作的翻譯編譯角色的缺點(diǎn)。Access可以通過(guò)傳遞查詢直接把事務(wù)SQL命令發(fā)往Sql Server,而不是讓jet數(shù)據(jù)引擎指導(dǎo)Access析數(shù)據(jù)請(qǐng)求怎樣在Sql Server上運(yùn)行。在Access是雖然沒(méi)有在鏈接表上運(yùn)行查詢直觀,但是圖形界面的缺憾卻換來(lái)了傳遞查詢中更多的控制和更好的理解。


一、認(rèn)識(shí)傳遞查詢


傳遞查詢與一般的Access查詢類似,但是在傳遞查詢的使用中只使用事務(wù)SQL(Sql Server使用有SQL),所以在Access中不能圖形化地建立傳遞查詢,而只能手工鍵入所有的SQL語(yǔ)句。
傳遞查詢有兩部分組成:以SQL寫(xiě)成的命令字符串和ODBC連接字符串。
SQL字符串包含一個(gè)或多個(gè)事務(wù)SQL語(yǔ)句,或者包含一個(gè)SQL程序流程控制語(yǔ)句的復(fù)雜過(guò)程,還可調(diào)用存在于Sql Server上的存儲(chǔ)過(guò)程。
ODBC連接字符串來(lái)標(biāo)識(shí)命令字符串將要發(fā)送的數(shù)據(jù)源,連接字符串也可包括指定Sql Server的用戶登錄信息。

所以在Access中傳遞查詢向Sql Server傳遞一組執(zhí)行的SQL命令,專門用于遠(yuǎn)程數(shù)據(jù)處理。


二、為什么要使用傳遞查詢


1)首先看看在鏈接表上運(yùn)行查詢的復(fù)雜步驟:
1、 jet數(shù)據(jù)庫(kù)引擎分析SQL字符串。
2、 jet數(shù)據(jù)庫(kù)引擎編譯SQL字符串并決定哪一部分發(fā)往Sql Server。
3、 jet數(shù)據(jù)庫(kù)引擎創(chuàng)建一個(gè)事務(wù)SQL命令字符串并將宻它發(fā)往Sql Server。
4、 Sql Server分析和編譯事務(wù)SQL命令字符串。
5、 Sql Server完命令字符串定義的任務(wù),如果有返回值的話,則向jet數(shù)據(jù)庫(kù)引擎返回結(jié)果記錄。

傳遞查詢包含的是事務(wù)SQL語(yǔ)句,它們被直接發(fā)往Sql Server進(jìn)行處理,并不需要jet數(shù)據(jù)庫(kù)引擎翻譯和編譯它們。


2)傳遞查詢的優(yōu)點(diǎn):


1、 傳遞查詢可以使用Sql Server的固有函數(shù)和存儲(chǔ)求過(guò)程。
2、 傳遞查詢可以記錄Sql Server返回的警告和統(tǒng)計(jì)信息。

3、 更新、查詢等動(dòng)作的傳遞查詢比基于鏈接表的Sql Server動(dòng)作查詢要快得多,尤其是在涉及記錄很多的情況下。


另外需要注意的是由于傳遞查詢是發(fā)往Sql Server處理數(shù)據(jù),因此傳遞查詢不能處理Access獨(dú)有函數(shù)和自定義函數(shù),也不能直接對(duì)本地Access表進(jìn)行操作。


三、存儲(chǔ)過(guò)程的使用


存儲(chǔ)過(guò)程是用一個(gè)或多個(gè)事務(wù)SQL編寫(xiě)的編譯后存儲(chǔ)在Sql Server上的一段程序。存儲(chǔ)過(guò)程與DOS的批處理文件類似,是一些一起批量運(yùn)行的多個(gè)命令。
例如:下面的過(guò)程首先創(chuàng)建一個(gè)名叫#MyTemp的臨時(shí)表,在此表中插入一對(duì)日期,然后返回#MyTemp和訂單表 連接的記錄。
Create procedure proc1 As
Create Table #MyTemp(開(kāi)始時(shí)間 DATETIME NOT NULL,結(jié)束時(shí)間 DATETIME NOT NULL)
Insert Into #MyTemp Value (‘1/1/2009’, ‘12/31/2009’)
Select 訂單.* from 訂單, #MyTemp
where 訂單.訂單時(shí)間>=#MyTemp.開(kāi)始時(shí)間 AND 訂單.訂單時(shí)間<=#MyTemp.結(jié)束時(shí)間
需要注意的是在事務(wù)SQL中,名字中有“#”“##”的表均是臨時(shí)表。
名字中有“#”的臨時(shí)表是本地表,在一個(gè)對(duì)話終止后它們被自動(dòng)丟棄。在上例中表#MyTemp僅在存儲(chǔ)過(guò)程的執(zhí)行過(guò)程中才存在。
名字中有“##”的臨時(shí)表是全局的,而且對(duì)所有連接都有效,一個(gè)全局臨時(shí)表在使用該表的最后一個(gè)對(duì)話終止時(shí)被丟棄。
存儲(chǔ)過(guò)程也可以接受變量作為輸入?yún)?shù)。下面的例子有兩個(gè)輸入變量,在事務(wù)SQL中所有變量的名必須以@開(kāi)頭。
Create procedure proc2 @startdate datetime,@enddate datetime as
Select 訂單.* from 訂單
where 訂單.訂單時(shí)間>=@startdate AND 訂單.訂單時(shí)間<=@enddate

當(dāng)兩個(gè)輸入?yún)?shù)為’1/1/2009’和’12/31/2009’運(yùn)行時(shí),此存儲(chǔ)過(guò)程會(huì)得到與PROC1同樣的結(jié)果,為2009年所定的貨。


四、在Access中調(diào)用存儲(chǔ)過(guò)程


1)傳遞查詢可以調(diào)用Sql Server的存儲(chǔ)過(guò)程,方法是在傳遞查詢的SQL命令字符串中加入存儲(chǔ)過(guò)程的名字,當(dāng)SQL字符串發(fā)到Sql Server后存儲(chǔ)過(guò)程被執(zhí)行。
傳遞查詢調(diào)用存儲(chǔ)過(guò)程時(shí)只要使用EXECUTE(也可簡(jiǎn)寫(xiě)為EXEC)就可以調(diào)用存儲(chǔ)過(guò)程了。
例如:EXECUTE PROC1
EXEC PROC2 @startdate=‘1/1/2009’,@enddate=‘12/31/2009’

EXEC PROC2 ‘1/1/2009’,‘12/31/2009’


Office交流網(wǎng)(http://m.mzhfr.cn)

2) 傳遞查詢也可以輸出參數(shù)。例如,假設(shè)有一個(gè)存儲(chǔ)過(guò)程myproc接受兩個(gè)字符串為輸入?yún)?shù)并返回一個(gè)字符為三個(gè)字符長(zhǎng)度的字符串為輸出參數(shù)。
下面的代碼執(zhí)行myproc將結(jié)果存入名為@outputparameter的變量作為輸出參數(shù),并返回@outputparameter的值。
Declear @output char(3)
Exec myproc ’參數(shù)1’,’參數(shù)2’, @outputparameter OUTPUT
Select @outputparameter
3) 傳遞查詢中如果包含多個(gè)存儲(chǔ)過(guò)程時(shí)要返回多個(gè)過(guò)程的數(shù)據(jù),但是在運(yùn)行這個(gè)查詢時(shí)它產(chǎn)生的表格視圖僅顯示第一個(gè)存儲(chǔ)過(guò)程產(chǎn)生的記錄。
想看到所有返回記錄的唯一方法是在Access中使用生成表查詢,它將接受傳遞查詢的結(jié)果并存放到Access本地表中。

Select *   Into allrecords  ‘Access本地表名稱     From myproc ‘傳遞查詢的名稱


這里必須用*,因?yàn)槊總€(gè)記錄集可能包含不同的列。當(dāng)這個(gè)生成表運(yùn)行時(shí),將生成多個(gè)表放置多個(gè)結(jié)果集,表的名稱為(如上例)allrecords、allrecords1、allrecords2、allrecords3、……

這個(gè)表名稱的編號(hào)由Access自動(dòng)完成。


4) 如果傳遞查詢中只運(yùn)行一個(gè)SQL語(yǔ)句或調(diào)用一個(gè)只返回一個(gè)記錄集,可以此傳遞查詢作為數(shù)據(jù)源建立窗體來(lái)察看數(shù)據(jù)結(jié)果。

如果傳遞查詢返回多個(gè)記錄集,以此為數(shù)據(jù)源建立窗體也只顯示第一記錄集的數(shù)據(jù)。


五、在VBA中創(chuàng)建使用傳遞查詢
傳遞查詢有一個(gè)最大的缺限就是沒(méi)有參數(shù)查詢功能,不能提示輸入?yún)?shù)。這時(shí)就需要使用VBA來(lái)解決這個(gè)問(wèn)題。
1)下例用VBA創(chuàng)建一個(gè)傳遞查詢:
dim mydb as database            ‘定義數(shù)據(jù)庫(kù)對(duì)象變量
dim myquery as querydef         ‘定義查詢對(duì)象變量
set mydb=currentdb()            ‘設(shè)置數(shù)據(jù)庫(kù)對(duì)象變量為當(dāng)前數(shù)據(jù)庫(kù)
set myquery=mydb.createquerydef(“test”)   ‘創(chuàng)建名為test的查詢
myquery.connect=” ODBC;DRIVER=SQL Server;_
SERVER=127.0.0.1\EXPRESS;UID=sa;PWD=system;DATABASE=cwbase1”’設(shè)置查詢?yōu)閭鬟f查詢并定義連接字符串
myquery.sql=”select * from zwkmzd”’設(shè)置SQL語(yǔ)句,相當(dāng)于傳遞查詢窗口中的語(yǔ)句
myquery.returnsrecords=true         ‘返回記錄為”真” Office交流網(wǎng)(http://m.mzhfr.cn)
docmd.openquery “test”            ‘運(yùn)行這個(gè)查詢,有數(shù)據(jù)窗口提供數(shù)據(jù)結(jié)果
2)修改一個(gè)已經(jīng)存在的傳遞查詢
dim mydb as database            ‘定義數(shù)據(jù)庫(kù)對(duì)象變量
dim myquery as querydef         ‘定義查詢對(duì)象變量
set mydb=currentdb()            ‘設(shè)置數(shù)據(jù)庫(kù)對(duì)象變量為當(dāng)前數(shù)據(jù)庫(kù)
set myquery=mydb.querydef(“test”) ‘設(shè)名為test的查詢
myquery.sql=”select * from zwpzk”’重新設(shè)置SQL語(yǔ)句,相當(dāng)于傳遞查詢窗口中的語(yǔ)句
myquery.returnsrecords=true         ‘返回記錄為”真”
myquery.execute         ‘運(yùn)行這個(gè)查,等價(jià)docmd.openquery “test”,但execute屬性只能用運(yùn)作查詢
3)向傳遞查詢傳遞參數(shù)
創(chuàng)建窗體,在窗體中建立一個(gè)文本框和一個(gè)按鈕,在按鈕的click事件中輸入以下代碼:
dim mydb as database            ‘定義數(shù)據(jù)庫(kù)對(duì)象變量
dim myquery as querydef         ‘定義查詢對(duì)象變量
set mydb=currentdb()            ‘設(shè)置數(shù)據(jù)庫(kù)對(duì)象變量為當(dāng)前數(shù)據(jù)庫(kù)
set myquery=mydb.createquerydef(“test”)   ‘創(chuàng)建名為test的查詢  Office交流網(wǎng)(http://m.mzhfr.cn)
myquery.connect=” ODBC;DRIVER=SQL Server;_
SERVER=127.0.0.1\EXPRESS;UID=sa;PWD=system;DATABASE=cwbase1”’設(shè)置查詢?yōu)閭鬟f查詢并定義連接字符串
myquery.sql=”exec myproc ’” & me![窗體文本框的值] & “’”’設(shè)置SQL語(yǔ)句,相當(dāng)于傳遞查詢窗口中的語(yǔ)句。當(dāng)然也可以用SQL語(yǔ)句。
myquery.returnsrecords=true         ‘返回記錄為”真”
docmd.openquery “test”            ‘運(yùn)行這個(gè)查詢,有數(shù)據(jù)窗口提供數(shù)據(jù)結(jié)果

也可以先創(chuàng)建一個(gè)傳遞查詢,設(shè)置傳遞查詢的屬性:創(chuàng)建連接字符串,returnsrecords屬性設(shè)為”yes”,把SQL字符串屬性留空。然后用修改傳遞查詢的方法進(jìn)行修改。


dim mydb as database            ‘定義數(shù)據(jù)庫(kù)對(duì)象變量
dim myquery as querydef         ‘定義查詢對(duì)象變量  Office交流網(wǎng)(http://m.mzhfr.cn) set mydb=currentdb()            ‘設(shè)置數(shù)據(jù)庫(kù)對(duì)象變量為當(dāng)前數(shù)據(jù)庫(kù)
set myquery=mydb.querydef(“test”) ‘設(shè)名為test的查詢
myquery.sql=”exec myproc ’” & me![窗體文本框的值] & “’”’重新設(shè)置SQL語(yǔ)句,相當(dāng)于傳遞查詢窗口中的語(yǔ)句。當(dāng)然也可以用SQL語(yǔ)句。
myquery.execute         ‘運(yùn)行這個(gè)查,等價(jià)docmd.openquery “test”


這樣傳遞查詢會(huì)根據(jù)輸入的參數(shù)被修改,保存,并可以在此存儲(chǔ)過(guò)程的基礎(chǔ)上創(chuàng)建查詢、報(bào)表。但是這個(gè)方法有一個(gè)問(wèn)題,就是需要修改現(xiàn)有的查詢和保存所作的改變。

總結(jié):

傳遞查詢是Access與Sql Server實(shí)現(xiàn)客戶機(jī)/服務(wù)器編程的重要工具,傳遞查詢比使用鏈接表更加直接的與Sql Server交互,繞過(guò)了jet數(shù)據(jù)庫(kù)引擎,實(shí)現(xiàn)了對(duì)Sql Server后臺(tái)有更多的控制,提高了整個(gè)系統(tǒng)的效率。



傳遞查詢相關(guān)技巧:

1.傳遞查詢的例子-在ACCESS中通過(guò)傳遞查詢調(diào)用Sql server后臺(tái)存儲(chǔ)過(guò)程

2.建立Access 傳遞查詢的詳細(xì)步驟

分享
文章分類
聯(lián)系我們
聯(lián)系人: 王先生
Email: 18449932@qq.com
QQ: 18449932
微博: officecn01
移動(dòng)訪問(wèn)