ストアドから別のストアドを作成できるのか?
- パラメータ付きストアドから、そのパラメータを展開したSELECT文のストアドを作成することは可能でしょうか?
- アクセスのデータシートビューを指定するにはパラメータが必要ですが、パラメータ付きのストアドを実行すると、都度入力が必要です。
- ストアドからストアドを作成し、パラメータを展開したSELECT文を実行することで、目的のデータシートビューを表示できると考えられます。
- ベストアンサー
ストアドから別のストアドを作成できますか?
パラメータ付きストアドから、そのパラメータを展開したSELECT文のストアドを作成する事は可能でしょうか? アクセスのデータシートビューを表示するにはパラメータがあっても指定出来ないようなんです。 「DoCmd.OpenStoredProcedure」でパラメータ付きのストアドを実行すると、 パラメータ用のインプットボックスが表示されその都度入力しなくてはなりません。 そこで、アクセスから@フィールド名 と @テーブル名 をパラメータとしてストアドを実行し、 ストアドで「SELECT @フィールド名 from @テーブル名」パラメータを展開したSELECT文にして、 別の名前を付けたパラメータ無しのストアドとして登録し、そのストアドを アクセスの「DoCmd.OpenStoredProcedure」で実行すれば、目的のデータシートビューを表示出来ると考えました。 ストアドからストアドを作成できるのでしょうか、可能であれば方法を教えて下さい。
- SEsyo
- お礼率78% (64/82)
- SQL Server
- 回答数2
- ありがとう数2
- みんなの回答 (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の出力も可能になりますので、もう少しトライしてみます。
関連するQ&A
- 複数フィールドを返すストアドからある1フィールドの値を取得するにはどの
複数フィールドを返すストアドからある1フィールドの値を取得するにはどのようにすればいいのでしょうか。 SP_Aというストアドがあります。 SP_Aストアドではパラメータ値を指定して該当するレコードをSELECTで取得しています。 ----------------------------- SELECT TOP 1 field1, field2, field3 WHERE field2 = @パラメータ値;, ----------------------------- 新たにSP_Bというストアドを作成してその中でこの上記のストアドを実行してfield3フィールドの値のみ取得したいと思っていますがどのようにすればいいのかわかりません。 このSP_Aストアドは既に色々な箇所で使用されている為、修正したくありません。 SP_Aストアドを修正しないでfield3フィールドの値のみ取得する事は可能でしょうか。 説明が下手ですみませんがうまく伝わりましたでしょうか。 ご存じの方がいましたらアドバイスいただけませんでしょうか。 些細な事でも何でも構いませんので宜しくお願いします。
- ベストアンサー
- SQL Server
- ストアドプロシージャについて
教えてください。 NT4.0上でAccess2000+MSDEで使用しているのです。 ストアドプロシージャでUPDATE文のあとにSELECT文を使い更新したデータを受け取ろうとしているのですが、実行すると「ストアドプロシージャは実行されましたがレコードは返されませんでした。」とメッセージが表示されるだけなのです。UPDATE文を注釈にするとレコードは返されるのでデータはあるのだと思います。 宜しくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- ストアドプロシージャが作成されない
●質問の主旨 phpMyAdminのMySQLで ストアドプロシージャの動作確認をしています。 試しに、 delimiter // create procedure pr30() begin select * from tb; select * from tb1l; select * from tb1; end // delimiter ; というプロシージャを作成して、 実行を押しても、画面が全く変化しません。 エラーの表示さえされません。 (もちろんデータベーステーブルのtb、tb1l、tb1が 存在することは確認済みです) また、作成している最中に、 命令文が勝手に消えることもあります。 普通に select * from tb; と、書いていても消えることはないのですが…。 この現象や対策についてご存知の方がいらっしゃいましたら、 アドバイスをお願いします。 ●環境 windows8 xammp1.8.1 phpMyAdmin3.5.2.2 MySQL5.5.27
- ベストアンサー
- MySQL
- 選択したフィールドだけのCSVを出力
ACCESS2003とSQLserver2008を使っています。 エンドユーザが画面でフィールド名を選択して、必要なフィールドだけ のCSV(エクセル)を出力したいのですが、そんなツールはないでしょうか? 作り込むとしたら、ストアドでSELECT文のフィールド名やテーブル名に 変数を使うことは可能でしょうか? (試したらフィールド名自体が件数分表示されました、テーブルは エラーになりました) また、どこかにサンプルなどはないでしょうか?
- ベストアンサー
- SQL Server
- ストアドの作成のコツは?
普段はAccessMDBの開発が多いのですが、ADPでのプログラミングに挑戦しています。 TSQLの理解が浅く、ストアドの作成のコツがつかめません。ご教授頂けませんか? やりたいことは、 ユーザーテーブルにある月間の集計を集計用テーブルへ書き出したいのです。 条件としては、集計テーブルに該当月のデータがない場合は追加、ある場合は更新としたいのです。 Accessからは、コマンドボタンからユーザーIDと該当年、月をパラメータとして渡すことを考えています。
- ベストアンサー
- SQL Server
- ストアドから得られるレコードセットを、別のストアドで利用したい
現在、実行するとあるレコードセット(1行1列のみ)を返すストアドプロシージャProc_Aがありますが、このプロシージャを実行して得られる結果を、 別のプロシージャProc_Bで、以下のような形で使用したいと考えています。 ただし、Case文内部でのストアドの実行や、変数へのストアドの実行結果の代入を試しましたが、どちらもうまくいっていません。 なにか、よい解決策があれば、教えていただければ、と思います。 パターンA) Case内部で直接実行 select case Table_A.param_1 when 0 then Exec Proc_A '***','**' else '' end パターンB)いったんパラメータとして取得 declare @values as char(10) execute sp_executesql N'@values = Proc_A ''***'',''**''', N'@values char(10) OUTPUT', @values OUTPUT
- 締切済み
- SQL Server
- ストアドプロシージャについて
Access2003とSQL Server2005Expressです。 初歩的な質問で恐縮です。 以下のストアドプロシージャのデータ取得先を、テーブルではなく 別のストアドプロシージャにしたいのですが、 その方法がわかりません。 CREATE PROCEDURE テスト AS SELECT コード, 社名, 住所, 電話 FROM 名簿 ↑ これをテーブルではなく、別のストアドプロシージャを 指定したのですが・・・。 ここをストアドプロシージャ名にするとエラーになります。 どうすればよろしいでしょうか?
- ベストアンサー
- SQL Server
- AccessVBAからのストアド起動について
現在、Accessで元来の記述にストアド起動の1文を追加し、 SQLserver上のmasterデータベースに登録しているストアドを起動させようとしております。 起動方法として、xp_cmdshellを利用してみたのですが、 しかし、起動に必要なパラメータの受け渡しが上手くいかないため、動作が正常に行われません。 『』部は実際には定数が入っております。 VBA内容は以下の通りです。 ・既存箇所 set DB = createobject( "adodb.connection" ) DB.oprn "PROVIDER = SQLOLEDB.SERVER = "『サーバIPアドレス』","『ログインID』","『ログインパスワード』" ~~~(ここで開いたDB中のテーブル上のデータを読み取るなど実行) ・追加しようとしている記述(Null時はNz関数で""に置換) A = 「パラメータ1」 B = 「パラメータ2」 C = 「パラメータ3」 (これらは上記のDBからRecordsetで取得。必要な値が取得できることは確認済み) strsql= "EXEC MATSER..xp_cmdshell ’EXEC mastter..『ストアド名』 & A & B & C & "'" DB.Execute stersql sqlserver上で起動するときは EXEC mastter..『ストアド名』 'パラメータ1' ,'パラメータ2' ,'パラメータ3' で起動することが確認記できております。 既存部でパラメータ引き渡しの必要のないストアドは動作しているため、 パラメータの引き渡しに問題があると判断しておりますが、 何パターンか変更してもうまく動かないため、 アドバイスをいただければと思います。
- ベストアンサー
- その他MS Office製品
- SQL-Server 6.5でストアドプロシージャの実行
EXECUTE procedure 'para1','para2' で正しい結果が返ってくるストプロがあります。 これをSELECT文の中で結果を返すようにするには どんな書き方をすれば良いのでしょうか? ストアドプロシージャを作成したのは今回が初めてで 試行錯誤しながらなんとか結果が返せるようになった のですが、私がISQLで試した方法ではうまく行きません。 <私の試した方法> SELECT procedure(tabe1.para1,tabe1.para2) FROM table1 SELECT文でストプロを実行することはできないのでしょうか? 宜しくお願いします。
- ベストアンサー
- その他(データベース)
お礼
ご指摘ありがとうございます。 まだまだ、動かす事に精一杯でなかなか気が回らないのが実情ですが、 今回の例で危険性は理解できました。 肝に銘じておきます。 tempdb や "SET NOCOUNT ON" も知っていて使っていないわけでなく、 使わなくても動いてしまうので、おざなりになっています。 これから調べてみます。 本当にいつもありがとうございます。