2011-01-28 47 views
3

我有一個相當複雜的SQL查詢與嵌套子查詢。當我嘗試在Microsoft Query中使用參數時,我說可以在不能用圖形表示的查詢中使用參數。所以我需要另一種選擇。我認爲你可以將你的SQL查詢放在一個單元格中作爲一個字符串,然後讓一個宏運行它。任何想法我可以做到這一點?在SQL查詢中使用參數與子查詢

感謝

-Jesse

回答

1

這裏是什麼,我來解決Microsoft查詢的限制在Excel 2007中:

  1. 一個在微軟產生一個虛擬的查詢(SELECT NULL AS Test,例如)查詢並將其插入到工作表中。
  2. 右鍵單擊MS Query剛剛插入的表格,然後單擊表格 - >編輯外部數據屬性。
  3. 單擊連接屬性按鈕,然後單擊定義選項卡。
  4. 在命令文本部分,使用通常的'?'約定爲參數寫出或粘貼所需的查詢,然後單擊確定。
  5. 單擊確定退出外部數據屬性窗口。
  6. 再次右鍵單擊表格,然後選擇Table-> Parameters以常規方式綁定參數。

這個想法是繞過MS Query提供的GUI,它具有底層引擎不具有的任意限制。

這適用於許多複雜的查詢,但不是全部。當我遇到MS Query拒絕摘要的查詢時,我要麼重構查詢(如果可行),要麼在SQL服務器上創建一個VIEW並針對該查詢進行查詢。

+0

工作就像一個魅力。感謝您的解決方法 – jomille 2011-02-01 02:49:04

0

不幸的是?對我的大多數查詢都不起作用,其中很多不適合轉換爲視圖。

我使用的主要替代越來越宏返回代碼

Dim Con As New ADODB.Connection 
Dim RS As New ADODB.Recordset 
Dim server, Database As String 
Dim Data as Worksheet 

Set data = ThisWorkBook.Worksheets("data") 

'rename field here and elsewhere to your variable eg SD or StartDate 
Dim field as string 

server = "servername" 
Database = "database" 

'set connection string 

If Con.State <> 1 Then 
Con.ConnectionString = "Provider=SQLOLEDB;Data Source=" & server & ";Initial Catalog=" & Database & ";Integrated Security=SSPI;" 


'this is just setting the connection time out to infinite 
setcono: 
Con.ConnectionTimeout = 0 
Con.CommandTimeout = 0 


'this is making sure it set the connection time out to infinite 
If Con.ConnectionTimeout > 0 Then GoTo setcono 
If Con.CommandTimeout > 0 Then GoTo setcono 

Con.Open 

Set oRS = New ADODB.Recordset 
oRS.ActiveConnection = Con 

field = Range("A2").value 

oRS.Source = "YOUR SQL QUERY " 
oRS.Source = oRS.Source & " WHERE field = '" & field & "'" 

oRS.Open 
data.Range("A2").CopyFromRecordset oRS 
End If 
oRS.Close 
Con.Close 
If Not oRS Is Nothing Then Set oRS = Nothing 
If Not Con Is Nothing Then Set oCon = Nothing 

我很想微軟修復錯誤,這錯誤的更復雜的查詢返回的錯誤,因爲我覺得它只是令人沮喪的創建宏返回一個簡單的數據集

0

另一種方式來解決這個問題的目的是使用,然後在桌子上適當的存儲過程

CREATE PROCEDURE [dbo].[yourprocedure] @DATEFROM DATETIME, @DATETO DATETIME 
AS 


SELECT Query 
where date >= @datefrom 
and date <= @dateto 

連接點擊連接屬性按鈕,然後點擊定義選項卡。在命令正文部分:

EXEC yourprocedure @DATEFROM = ?, @DATETO = ? 

並直接在?到你想要的細胞