我有一个稍微复杂(但类似)的问题,不涉及存储过程。
以为我会分享,以防有人发现自己处于类似的位置。
问题
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 之后取回结果,因此将其分成单独的命令(执行)并仅在我们查询所需数据时打开记录集似乎可以解决问题。
一个附带问题是我需要使用临时表(我实际上并没有意识到我有权限这样做,因为它是一个实时数据库而且我以前从未使用过这些),因为我相信变量表会消失我打第二个电话的时间。
其他需要注意的事项
- 确保仅在完成所有操作后才关闭连接(最初我从单独的函数调用每个命令,并且每次都打开/关闭连接而不考虑它)
- 确保最后删除临时表
希望这对其他人有帮助!