- ベストアンサー
ストアドから別のストアドを作成できるのか?
- パラメータ付きストアドから、そのパラメータを展開したSELECT文のストアドを作成することは可能でしょうか?
- アクセスのデータシートビューを指定するにはパラメータが必要ですが、パラメータ付きのストアドを実行すると、都度入力が必要です。
- ストアドからストアドを作成し、パラメータを展開したSELECT文を実行することで、目的のデータシートビューを表示できると考えられます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。老婆心ながら。。 ・こういうテーブルを作成する場合は、どちらかというとtempdbに作成した方がいいです。 おそらく今のデータベースはオンライン更新の掛る業務DBなので、復旧モードがフルになっているはずです。 したがって、バルクのデータ処理を繰り返し実行すると、トランザクションログが膨らみます。 ・前にも書きましたが、動的SQLを使う場合は、どういう方法でもいいのでパラメータは検証してください。 今回のケースで、パラメータを検証しないと、 @テーブル varchar (50),@フィールド varchar (max)というパラメータに EXEC ストアド1 'テーブル1; DROP TABLE テーブル1--','*' EXEC ストアド1 'テーブル1','* FROM 見てほしくないテーブル--' という渡し方もできてしまいます。 このストアドの存在を実行できる人は基本的に何でもできることになりますから、セキュリティ上好ましくないです。 イントラだからいいだろうと思わないで検証する習慣にした方がおすすめです。 (アプリケーションとデータベースは別物なので、データベースにしてみれば自分の身は自分で守らないといけません) ・ストアドの先頭に"SET NOCOUNT ON"を切るのも習慣にした方がいいです。 場合によってはデータセットが受け取れないかもしれません。
その他の回答 (1)
- jamshid6
- ベストアンサー率88% (591/669)
adpは別に詳しいわけではありませんが、データシートビューではCurrentProject.Connection.Executeは使えないのですか? ストアドプロシージャの中でEXECなり、sp_executesqlなり、動的SQLで作成すれば可能です。 ただ、あまりお勧めするものではありません。 ・本来永続的であるべきオブジェクトを一時的に作成しては削除すること (今回の例ではローカル一時ストアドプロシージャはたぶん使えないと思うので) ・ユニークな名前を付けなければ、名前が競合する可能性があること 同一セッションが維持されている状態で一連のアクションが行われるのであれば(adpはそうじゃないかと思いますが)、 ・(セッションID、テーブル名、フィールド名)というテーブルでも作って、そこにデータをINSERTする ・パラメータのないストアドはそこからセッションIDで条件を拾って実行する。実行後データを削除する などのアプローチの方がいいような気もしますが。
お礼
テーブルの一覧は「RefreshDatabaseWindow」で一発でOKでした。 VBAからストアドが作れるとは知りませんでした、勉強します。 ありがとうございました。 データベースの選択→テーブル(ビュー)の選択→フィールドの選択と プレビュー、出力までできましたので、基本形は完成しました。 これから検索条件の設定に入ります。 また、よろしくお願いします。
補足
・(セッション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の出力も可能になりますので、もう少しトライしてみます。
お礼
ご指摘ありがとうございます。 まだまだ、動かす事に精一杯でなかなか気が回らないのが実情ですが、 今回の例で危険性は理解できました。 肝に銘じておきます。 tempdb や "SET NOCOUNT ON" も知っていて使っていないわけでなく、 使わなくても動いてしまうので、おざなりになっています。 これから調べてみます。 本当にいつもありがとうございます。