SQL Server 2005 (ネイティブ クライアント) に対して ODBC と C++ を使用しています。
定数値の 2 つの行を返す次の単純なテスト ストアド プロシージャがあります。
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 はより複雑で、テーブル変数が必要です。それについて説明する必要はありません。しかし、最初の SP からの結果セットに対して (ODBC) カーソルを作成できないのはなぜでしょうか?
これを機能させる方法を知っている人はいますか?ところで、環境ハンドルで ODBC v3 をアサートしています。接続ハンドルでさまざまなカーソル属性を試しましたが、役に立ちませんでした。
助けていただければ幸いです。