2014-02-19 44 views
0

我在SQL Server中有一個大的查詢,它返回許多行和列。我需要在MS Access中爲該查詢創建一個用戶界面。爲了運行查詢,我需要將一些變量傳遞給查詢。例如:將值從Access傳遞到SQL服務器中的變量

DECLARE @start_date日期,@end_date日期 SELECT * FROM mytable的 WHERE日之間@start_date和@end_date

我知道,我不能在Access查詢觀衆DECLARE語句。但是還有另外一種將這些參數傳遞給查詢的方法嗎? 我讀過它可以用VBA完成,但我只想確認沒有其他方法將值傳遞給變量。

理想情況下,我需要的是通過MS ACCESS與SQL Server進行交互

感謝

+0

http://stackoverflow.com/questions/12404805/how-to-call-sql-server-stored-procedure-from-within-ms-access-vba –

回答

0

是的,有辦法通過訪問傳遞參數的查詢。您可以在窗體上使用控件(文本框等)。然後,您可以參考SQL中的CriteriaWHERE)部分的控件。

所以,如果我是用戶指定的兩個日期之間要DELETE *記錄員工在一個表中,我將引用控制的形式,像這樣:

Between Forms![StartDateTxt] And Forms![EndDateTxt] 
1

你不提,其中/如何/何時該查詢保存在SQL服務器上。說明你有很大的查詢但離開這個查詢所在的地方是很大的細節。

但是,你問,你可以傳遞值到SQL服務器沒有任何代碼?答案是肯定的,但這意味着您最好的方法是創建+將大型查詢服務器端保存爲VIEW。你將不需要任何參數。

你再發動訪問的形式(或報告)時,只需連接一個where子句:

MyDate is Between Forms!ReportPrompt!startDate and forms!ReportPrompt!EndDate 

以上意味着沒有VBA,沒有參數,如果查詢有一個百萬行,但僅有一行符合您的標準,那麼只有一行將下到網絡管道。您只需在報告中輸入以上內容,然後將報告設置爲在加載屬性=是時進行過濾。

但是,正如你所提到的,你不提供關於你的查詢在服務器端保存的位置或方式的信息。如果你談論的是一個存儲過程(一個龐大的細節,離開了),那麼你可以通過parmaters這樣:

Dim qdfPass  As DAO.QueryDef 
Dim rst   As DAO.Recordset 
Set qdfPass = CurrentDb.QueryDefs("MyPass") 
qdfPass.SQL = "exec sp_myProc " & MyP1Var & "," & MyP2Var 
qdfPass.Execute 

上述假定您保存通過查詢客戶端一通稱爲爲mypass。

事實上,有十幾種方法可以將值傳遞給SQL服務器,但沒有關於何時/如何/何時/何時以及在何種情況下查詢數據將被消費的更多信息,那麼我們只面對野生和猜測猜測。

如果生成的數據用於報告,則如前所述,您並不真正需要(也不會從中受益)存儲過程,並使用「where」子句作爲打開報告命令的一部分就足夠了。如果您希望將此數據返回到表單,則適用相同的建議。

如果查詢和存儲過程僅用於服務器端處理,那麼調用存儲過程並傳遞參數的上述代碼就足夠了。

+0

謝謝你的:查詢不保存在時刻。該查詢做了很多計算,因此它需要傳遞參數。我沒有想過要把它當作SP來做。所以你提供的上述代碼需要進入VBA編輯器? 我想要的是將這個查詢的結果放入Access中,放入一個表格中。我嘗試了一個Pass,但是我一直在阻止值傳遞給參數。 數據將用於在表單中顯示,稍後會由用戶更新一些數據。 – user2343837

+0

我無法通過使用上面的代碼傳遞參數。它保持說我的SP需要一個參數,即使我使用這個代碼傳遞它。 – user2343837

+0

您需要將數據作爲本地表格使用,還是隻將數據作爲報告的來源?在我上面的qdfPass.SQL =「你的sql在這裏」,只需添加一個「where」子句的SQL。不需要SP或parmaters。然後根據這個passthough運行你的報告。 –

0

@Albert D. Kallal給出了使用存儲過程並傳入值作爲參數的最佳方法。這樣做有例如一些其他的方法: -

  1. 通過ADODB在VBA代碼: -

    昏暗CON作爲新ADODB.Connection 昏暗RS作爲新ADODB.Recordset

    con.Open 「SQLSRV」, 「用戶」, 「通行證」 rs.Open 「DECLARE @start_date日期,@end_date日期; SELECT * FROM mytable的WHERE日之間@start_date和@end_date」,CON

  2. 你可以寫一個「通過」查詢t帽子做同樣的事情。

這兩種方法將在目前的工作不過微軟正在試圖消除對傳遞多個SQL語句在一個單一的執行,你可能會發現,更高版本的TDS(表格數據流的支持 - 該協議MS OBDC驅動程序與SQL Server通信)不支持這一點。

相關問題