アプリ版:「スタンプのみでお礼する」機能のリリースについて

パラメータ付きストアドから、そのパラメータを展開したSELECT文のストアドを作成する事は可能でしょうか?

アクセスのデータシートビューを表示するにはパラメータがあっても指定出来ないようなんです。
「DoCmd.OpenStoredProcedure」でパラメータ付きのストアドを実行すると、
パラメータ用のインプットボックスが表示されその都度入力しなくてはなりません。

そこで、アクセスから@フィールド名 と @テーブル名 をパラメータとしてストアドを実行し、
ストアドで「SELECT @フィールド名 from @テーブル名」パラメータを展開したSELECT文にして、
別の名前を付けたパラメータ無しのストアドとして登録し、そのストアドを
アクセスの「DoCmd.OpenStoredProcedure」で実行すれば、目的のデータシートビューを表示出来ると考えました。

ストアドからストアドを作成できるのでしょうか、可能であれば方法を教えて下さい。

A 回答 (2件)

#1です。

老婆心ながら。。

・こういうテーブルを作成する場合は、どちらかというとtempdbに作成した方がいいです。
 おそらく今のデータベースはオンライン更新の掛る業務DBなので、復旧モードがフルになっているはずです。
 したがって、バルクのデータ処理を繰り返し実行すると、トランザクションログが膨らみます。

・前にも書きましたが、動的SQLを使う場合は、どういう方法でもいいのでパラメータは検証してください。
 今回のケースで、パラメータを検証しないと、
 @テーブル varchar (50),@フィールド varchar (max)というパラメータに
 
EXEC ストアド1 'テーブル1; DROP TABLE テーブル1--','*'
EXEC ストアド1 'テーブル1','* FROM 見てほしくないテーブル--'

 という渡し方もできてしまいます。
 このストアドの存在を実行できる人は基本的に何でもできることになりますから、セキュリティ上好ましくないです。
 イントラだからいいだろうと思わないで検証する習慣にした方がおすすめです。
 (アプリケーションとデータベースは別物なので、データベースにしてみれば自分の身は自分で守らないといけません)

・ストアドの先頭に"SET NOCOUNT ON"を切るのも習慣にした方がいいです。
 場合によってはデータセットが受け取れないかもしれません。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。

まだまだ、動かす事に精一杯でなかなか気が回らないのが実情ですが、
今回の例で危険性は理解できました。 肝に銘じておきます。

tempdb や "SET NOCOUNT ON" も知っていて使っていないわけでなく、
使わなくても動いてしまうので、おざなりになっています。
これから調べてみます。 本当にいつもありがとうございます。

お礼日時:2009/06/18 15:03

adpは別に詳しいわけではありませんが、データシートビューではCurrentProject.Connection.Executeは使えないのですか?



ストアドプロシージャの中でEXECなり、sp_executesqlなり、動的SQLで作成すれば可能です。
ただ、あまりお勧めするものではありません。
・本来永続的であるべきオブジェクトを一時的に作成しては削除すること
 (今回の例ではローカル一時ストアドプロシージャはたぶん使えないと思うので)
・ユニークな名前を付けなければ、名前が競合する可能性があること

同一セッションが維持されている状態で一連のアクションが行われるのであれば(adpはそうじゃないかと思いますが)、
・(セッションID、テーブル名、フィールド名)というテーブルでも作って、そこにデータをINSERTする
・パラメータのないストアドはそこからセッションIDで条件を拾って実行する。実行後データを削除する
などのアプローチの方がいいような気もしますが。

この回答への補足

・(セッションID、テーブル名、フィールド名)というテーブルでも作って、そこにデータをINSERTする

↑の方式を検討してみます、ありがとうございました。

朝から、↓の方式を試していましたが、新しいテーブルを作成したあと、
ACCESSからDBへ再接続(テーブル一覧の取得のため)が必要なので悩んでいます。

@テーブル varchar (50),@フィールド varchar (max)
AS
declare @端末名 varchar(20)
select @端末名 = host_name()
if (select count(name) from sysobjects where name = @端末名) = 1
 begin
 exec ('drop table ' + @端末名 )
 end
exec ('SELECT ' + @フィールド + ' into ' + @端末名 + ' FROM ' + @テーブル)

この、テーブルを作成する方法だとエクセルだけでなく、CSVの出力も可能になりますので、もう少しトライしてみます。

補足日時:2009/06/18 12:07
    • good
    • 0
この回答へのお礼

テーブルの一覧は「RefreshDatabaseWindow」で一発でOKでした。

VBAからストアドが作れるとは知りませんでした、勉強します。
ありがとうございました。

データベースの選択→テーブル(ビュー)の選択→フィールドの選択と
プレビュー、出力までできましたので、基本形は完成しました。
これから検索条件の設定に入ります。
また、よろしくお願いします。

お礼日時:2009/06/18 13:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す