
パラメータ付きストアドから、そのパラメータを展開した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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
インストール可能なISAMド...
-
SQL Server management studio ...
-
自己相関サブクエリと自己結合...
-
Accessの重複なしのカウントの...
-
ACCESS2007 フォーム 「バリア...
-
至急お願いします!C# グループ...
-
sqlserverで対象のレコードを削...
-
Access2021 「ISNULL関数には引...
-
AccessのInsertクエリのあとつ...
-
これをSQL文で出来るでしょうか?
-
データベースのメタ値はどこに...
-
SQLで、行ごとのとある要素を比...
-
SQLについて質問です。 テーブ...
-
SQLServer 日付が直前のレコー...
-
SQLのエラー(~付近に不適切な...
-
SQLCMDにて教えていただきたい...
-
SQLの条件順番について(SQLser...
-
SQLサーバーのやり方
-
sqlで、600行あるテーブルを100...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLServer 分散トランザクショ...
-
ストアド、トリガーの同時呼出
-
トリガが完全にかからない
-
ストアドプロシージャの多用で...
-
エクセルアドインの使用方法に...
-
SQL Server INSERTのトリガで採番
-
SQL Serverトリガの中でDMLの種...
-
ストアド更新履歴
-
EXCELのマクロ
-
ストアドプロシージャーのパラ...
-
NETWORKDAYS関数について
-
mdbでトリガはできますか?
-
ストアドでXMLファイルを読込む...
-
SQLでORを略す方法
-
ストアドプロシージャでのファ...
-
「マスタ」と「テーブル」の違...
-
accessで移動平均する方法
-
請求と入金のテーブルの作成の...
-
SQLで○○の値以外を持っているレ...
-
ACCESS2000のテーブル構造
おすすめ情報