SQL Server のページング、 Power Shell

Accessプロジェクトのトラブルシューティングはまだ続いています。
この2ヶ月で細かいバグを10個ほど修正し、全面書き換え2本のコードを書いています。
1本はほぼ完成。もう一本も今週中には終わらせたいと思っています。

細かい手直しの部類です。次のようなものがありました。

SQL Serverの結果データをAccessシートで表示するには、レコード数10,000が限界のうようです。

数万レコードをページングして自由に表示するには工夫が必要です。
幸いSQL Server 2008では新たに、共通テーブル式(CTE)ROW_NUMBERが使えます。

CTEの構文は次のようなものです。

WITH <CTEの名前>(<列の名前>)
AS
(
<クエリ>
)
(SELECT * FROM <CTEの名前>)

ROW_NUMBERは<クエリ>の結果に自動で行番号を振ります。
その列名を今RowNumberとして次のような文を作成します(@開始行等は変数名です)。

WITH tmpTable
AS
(
SELECT T.*, ROW_NUMBER() OVER (ORDER BY 商品CD) AS RowNumber FROM [WRK_商品] T
)
SELECT * FROM tmpTable
WHERE RowNumber BETWEEN @開始行 AND (@開始行+@行数-1)

Accessフォームにデータを連結するには、フォームのレコードソース・プロパティにSQLやテーブル名を設定します。
ところが設定する文の長さが128文字(正確ではありません。忘れました)に制限されていて、
どうしても上の文を128文字以下にできません。

次の手はこれを下のように引数付きのストアドプロシージャにすることです。

CREATE PROCEDURE [Sp_商品表示] (
@開始行 integer,
@行数 integer
)
AS
BEGIN
WITH tmpTable
AS
(
SELECT T.*, ROW_NUMBER() OVER (ORDER BY 商品CD) AS RowNumber FROM [WRK_商品] T
)
SELECT * FROM tmpTable
WHERE RowNumber BETWEEN @開始行 AND (@開始行+@行数-1)
END

ところが今度は引数付きのストアドプロシージャをどうやって先のプロパティに設定すればいいのかわかりません。
あちこち情報を探し回りましたが、使っているAccessそのものが古い(2003)し、なかなか思った解決策が見つかりません。
やっと探し当てました。
次のようにストアドプロシージャをExecでコールすればいいのです。
結構早く反応します。

Form_商品表示.RecordSource = “Exec [Sp_商品表示] ” & 開始行 & “,” & 行数

話は変わりますが、私はPerlをよく使います。
DBの結果出力が正しいかどうか。
SQL Serverでは結果セットをCSVに書き出すことができます。
正しい結果のCSVがあるとして、これとテスト結果との突合せにPerlで小さいプログラムを書けば簡単に照合できます。
テキストデータ(ファイル)の検査とか、変更とかこれほど便利なツールはないと、
Perlをとても重宝しています。

また話は変わりますが、今回色々調べていて、Windows Power Shellなるものがあることを知りました。
これまでは、バッチブログラムの実行はコマンドプロンプトWindowを開いて、いくつかのDOSコマンドを敲き、プログラムを起動していました。

このことに不便は感じていなかったのですが、Windows Power Shell(以下PS)があることを知りましたので、どんなものか勉強してみました。
Perlのようなものかと思いましたが、確かにPerlの記法も取り入れていますが、
WindowsでGUIを使って色々操作していたこと(システム管理)が、
大抵このPSで実行可能らしいことがわかりました。
Perlとは違う場所でこれはこれで「使えそうだ」という感想を持っています。

error: コピーできません !!