我有一個稍微複雜一點的(但類似的)問題不涉及存儲過程。
以爲我會分享以防萬一有人發現自己處於類似的位置。
問題
SQL:
DECLARE @a (
Alpha VARCHAR(10),
Beta INT
);
INSERT @a VALUES
('A', 1)
DECLARE @b (
Gamma DATE,
Delta INT
);
INSERT @b VALUES
('2014-01-01', 1)
SELECT *
FROM @a a
JOIN @b b ON a.Beta = b.Delta
VBA:
Sub GetData()
Dim sSql
Dim oConnection As New ADODB.Connection
Dim oRecordSet As New ADODB.Recordset
Call oRecordSet.Open(sSqlQuery, oConnection, adOpenStatic, adLockReadOnly)
Call oConnection.Open("Provider=SQLOLEDB.1;Server=MyServer;Database=MyDB;Trusted_Connection=Yes;")
sSql = <as Above>
Call oRecordSet.Open(sSql, oConnection, adOpenStatic, adLockReadOnly)
If oRecordSet.RecordCount > 0 Then
' DO STUFF WITH DATA
End If
' Close objects
oConnection.Close
oRecordSet.Close
End Sub
解決方案
SQL_1
CREATE TABLE #a (
Alpha VARCHAR(10),
Beta INT
);
INSERT #a VALUES
('A', 1)
SQL_2
CREATE TABLE #b (
Gamma DATE,
Delta INT
);
INSERT #b VALUES
('2014-01-01', 1)
SQL_3
SELECT *
FROM #a a
JOIN #b b ON a.Beta = b.Delta
SQL_4
DROP TABLE #a;
SQL_5
DROP TABLE #b;
VBA
Sub GetData()
Dim sSql
Dim oConnection As New ADODB.Connection
Dim oRecordSet As New ADODB.Recordset
Call oConnection.Open("Provider=SQLOLEDB.1;Server=MyServer;Database=MyDB;Trusted_Connection=Yes;")
sSql = <SQL_1>
Call oConnection.Execute(sSql)
sSql = <SQL_2>
Call oConnection.Execute(sSql)
sSql = <SQL_3>
Call oRecordSet.Open(sSql, oConnection, adOpenStatic, adLockReadOnly)
If oRecordSet.RecordCount > 0 Then
' DO STUFF WITH DATA
End If
sSql = <SQL_4>
Call oConnection.Execute(sSql)
sSql = <SQL_5>
Call oConnection.Execute(sSql)
oConnection.Close
oRecordSet.Close
End Sub
說明
基本上我的理解是,VBA試圖在初始INSERT之後獲得結果,因此將它分離爲單個命令(Executes),並且在查詢我們想要的數據時只打開記錄集似乎可以做到這一點。
這是一個問題,我需要使用臨時表(我沒有實際意識到我有權限做,因爲它是一個活的數據庫,我從來沒有用過這些),因爲我相信變量表在我第二次打電話時會消失。
其他的事情要注意的
- 確保你只關閉連接,你所做的一切(最初我不得不從單獨的函數調用的每個命令,並打開/每次關閉連接後不假思索地)
- 確保刪除臨時表末
希望這可以幫助其他人!
那工作,謝謝!我完全錯過了這一點,我通常會在我的sp中加入這一行。 –