Я использую ODBC и C ++ против SQL Server 2005 (собственный клиент).
У меня есть следующая простая тестовая хранимая процедура, которая возвращает две строки постоянных значений:
CREATE PROCEDURE usp_testme AS BEGIN
declare @details table( one int, two int, three int, four int )
insert @details SELECT 1 one, 2 two, 3 three, 4 four UNION SELECT 5, 6, 7, 8
select one, two, three, four from @details
END
Код ODBC выглядит следующим образом (упрощенно):
SQLExecDirect( m_hstmt, (SQLCHAR *)"{CALL usp_testme}", SQL_NTS );
SQLFetch( m_hstmt );
Вызов SQLExecDirect () возвращает следующую информацию:
INFO: 16954 : 01000 : [Microsoft etc]Executing SQL directly; no cursor
и вызов SQLFetch () дает:
INFO: 0 : 24000 : [Microsoft etc]Invalid cursor state
Справочная документация ODBC говорит мне, что у меня нет набора результатов.
Поэтому вместо этого я заменяю хранимую процедуру следующим (например, не используя переменную таблицы):
CREATE PROCEDURE usp_testme AS BEGIN
SELECT 1 one, 2 two, 3 three, 4 four UNION SELECT 5, 6, 7, 8
END
и вуаля, это работает. Конечно, это простая процедура тестирования, реальный SQL, который мне нужно выполнить, является более сложным и требует табличной переменной, не нужно вдаваться в подробности. Но почему нельзя создать курсор (ODBC) для набора результатов из первого SP?
Кто-нибудь знает, как заставить это работать?
Кстати, я утверждаю ODBC v3 на дескриптор среды. Я пробовал разные атрибуты курсора на дескрипторе соединения, но безрезультатно.
Помощь очень ценится!