я был немного более сложным (но подобный) вопрос, не связанным с хранимой процедурой.
Думал, что я поделился бы тем случаем, когда бы кто-нибудь оказался в подобном положении.
ПРОБЛЕМА
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. –