単一のテーブル (結合なし) から列を選択しようとしていますが、理想的には行の取得を開始する前に、行数のカウントが必要です。必要な情報を提供する 2 つのアプローチにたどり着きました。
アプローチ 1:
SELECT COUNT( my_table.my_col ) AS row_count
FROM my_table
WHERE my_table.foo = 'bar'
それで
SELECT my_table.my_col
FROM my_table
WHERE my_table.foo = 'bar'
またはアプローチ2
SELECT my_table.my_col, ( SELECT COUNT ( my_table.my_col )
FROM my_table
WHERE my_table.foo = 'bar' ) AS row_count
FROM my_table
WHERE my_table.foo = 'bar'
SQL ドライバー (SQL Native Client 9.0) では SELECT ステートメントで SQLRowCount を使用できないため、これを行っていますが、情報を割り当てる前に配列を割り当てるために、結果の行数を知る必要があります。残念ながら、動的に割り当てられたコンテナーの使用は、私のプログラムのこの領域ではオプションではありません。
次のシナリオが発生する可能性があることを懸念しています。
- SELECT for count 発生
- 別の命令が発生し、行を追加または削除します
- データの SELECT が発生し、突然配列が間違ったサイズになります。
-最悪の場合、配列の制限を超えてデータを書き込もうとして、プログラムがクラッシュします。
アプローチ 2 はこの問題を禁止しますか?
また、2 つのアプローチのどちらかが高速になりますか? もしそうなら、どれ?
最後に、考慮すべきより良いアプローチはありますか (おそらく、SQLRowCount を使用して SELECT 結果の行数を返すようにドライバーに指示する方法はありますか?)
質問された方のために、私はネイティブ C++ と前述の SQL ドライバー (Microsoft が提供) を使用しています。