パラメータ付きストアドから、そのパラメータを展開したSELECT文のストアドを作成する事は可能でしょうか?
アクセスのデータシートビューを表示するにはパラメータがあっても指定出来ないようなんです。
「DoCmd.OpenStoredProcedure」でパラメータ付きのストアドを実行すると、
パラメータ用のインプットボックスが表示されその都度入力しなくてはなりません。
そこで、アクセスから@フィールド名 と @テーブル名 をパラメータとしてストアドを実行し、
ストアドで「SELECT @フィールド名 from @テーブル名」パラメータを展開したSELECT文にして、
別の名前を付けたパラメータ無しのストアドとして登録し、そのストアドを
アクセスの「DoCmd.OpenStoredProcedure」で実行すれば、目的のデータシートビューを表示出来ると考えました。
ストアドからストアドを作成できるのでしょうか、可能であれば方法を教えて下さい。
No.2ベストアンサー
- 回答日時:
#1です。
老婆心ながら。。・こういうテーブルを作成する場合は、どちらかというとtempdbに作成した方がいいです。
おそらく今のデータベースはオンライン更新の掛る業務DBなので、復旧モードがフルになっているはずです。
したがって、バルクのデータ処理を繰り返し実行すると、トランザクションログが膨らみます。
・前にも書きましたが、動的SQLを使う場合は、どういう方法でもいいのでパラメータは検証してください。
今回のケースで、パラメータを検証しないと、
@テーブル varchar (50),@フィールド varchar (max)というパラメータに
EXEC ストアド1 'テーブル1; DROP TABLE テーブル1--','*'
EXEC ストアド1 'テーブル1','* FROM 見てほしくないテーブル--'
という渡し方もできてしまいます。
このストアドの存在を実行できる人は基本的に何でもできることになりますから、セキュリティ上好ましくないです。
イントラだからいいだろうと思わないで検証する習慣にした方がおすすめです。
(アプリケーションとデータベースは別物なので、データベースにしてみれば自分の身は自分で守らないといけません)
・ストアドの先頭に"SET NOCOUNT ON"を切るのも習慣にした方がいいです。
場合によってはデータセットが受け取れないかもしれません。
ご指摘ありがとうございます。
まだまだ、動かす事に精一杯でなかなか気が回らないのが実情ですが、
今回の例で危険性は理解できました。 肝に銘じておきます。
tempdb や "SET NOCOUNT ON" も知っていて使っていないわけでなく、
使わなくても動いてしまうので、おざなりになっています。
これから調べてみます。 本当にいつもありがとうございます。
No.1
- 回答日時:
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の出力も可能になりますので、もう少しトライしてみます。
テーブルの一覧は「RefreshDatabaseWindow」で一発でOKでした。
VBAからストアドが作れるとは知りませんでした、勉強します。
ありがとうございました。
データベースの選択→テーブル(ビュー)の選択→フィールドの選択と
プレビュー、出力までできましたので、基本形は完成しました。
これから検索条件の設定に入ります。
また、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- メディア・マスコミ ドイツのGNPが高いのはストで無能な経営者を首にしているから 2 2022/08/02 01:24
- 国産車 スズキキャリーについて ネットを見ていて40年ほど前のDA型は2スト、4ストが選択出来たとあります。 5 2022/09/18 09:36
- 就職 ドイツの一人当たりGDPが日本より高いのは 2 2022/07/28 16:21
- 国産車 スズキT5A550ccとF5A550ccでは T5Aの方が2ストなので力強いのですか。 私が子供の頃 3 2023/05/14 10:52
- その他(バイク) なぜ草刈りは排ガス規制の対象ではないのですか?2ストでうるさいし、 なんで令和なのに2スト?昭和の遺 5 2023/03/11 09:22
- X(旧Twitter) ツイッター 永久凍結されても捨てアド作るアプリ 教えてください 2 2022/05/06 04:37
- 商店街 あなたは言える勇気がありますか。 4 2022/04/16 09:18
- バラエティ・お笑い 昨日のアド街で富津の波瑠菜亭でアジフライの紹介している時にかかっていた洋楽の名前を教えて下さい! 2 2022/08/14 11:16
- Access(アクセス) access レポート 請求書について 2 2022/07/04 22:52
- Chrome(クローム) Chromeの描画領域を2分割して異なるスクロール位置を同時に表示させることはできますか 1 2023/03/01 16:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLServer 分散トランザクショ...
-
「マスタ」と「テーブル」の違...
-
ACCESSのSQLで、NULLかNULLでな...
-
2つのテーブルから条件に一致...
-
3つ以上のテーブルをUNIONする...
-
重複するキーから一番古い年月...
-
[ BETWEEN ] vs [ >= AND <= ]
-
ACCESS 一番最新の日付の金額...
-
ACCESS2007 フォーム 「バリア...
-
Access VBA Me.Requery レコー...
-
accessテーブル作成クエリを実...
-
accessのロック
-
ManagementStudioからのデータ削除
-
Accessのリンクテーブルについて
-
オラクルではできるのにSQLSERV...
-
Access VBA [リモートサーバー...
-
PostgreSQLで外部DB内のテーブ...
-
ビューで引数を使いたい
-
sqlserverで集計結果をUPDATEし...
-
SI Object Browserのテーブルス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLServer 分散トランザクショ...
-
エクセルアドインの使用方法に...
-
ストアドプロシージャでのファ...
-
トリガが完全にかからない
-
ストアド更新履歴
-
ストアドプロシージャーのパラ...
-
ストアド、トリガーの同時呼出
-
SQL Server INSERTのトリガで採番
-
ストアドプロシージャの多用で...
-
SQLServer7.0 重大な例外「EXCE...
-
T-SQLで一時テーブルの名前を毎...
-
SQL Serverトリガの中でDMLの種...
-
ソリューションエクスプローラ...
-
ストアド(PL/SQL)でログイン処...
-
SQLServerのトリガ機能について...
-
「マスタ」と「テーブル」の違...
-
[ BETWEEN ] vs [ >= AND <= ]
-
2つのテーブルから条件に一致...
-
ACCESSのSQLで、NULLかNULLでな...
-
オラクルではできるのにSQLSERV...
おすすめ情報