人に聞けない痔の悩み、これでスッキリ >>

SQLServer初心者です。

社内で顧客情報を管理するためAccessを使っています。
フォームを使って検索,登録等できるようにしています。
データ量が増えてきたので,
テーブルのみSQLServerに移行することになりました。

ただ単にテーブルをSQLServerに移行して
クエリ等はそのままで使ってみたところまったく高速化されませんでした。

Accessで行っている動作は以下です。

フォーム上に設置した検索用テキストボックスに「ヤマダ」と入力して
「検索」ボタンをクリックすると
リストボックスに「ヤマダ」とつく氏名一覧が出てきて,
該当する氏名をクリックすると,右側にその人の詳細情報が表示されます。
抽出はAccessクエリで行っています。

検索用テキストボックスを使って,Accessのクエリで絞り込みをしているのですが
パススルークエリを利用してSQLServer上で絞り込みをすることができるようだと
調べていて知りました。

しかしそのやり方がうまくWEBで検索できずにいます。

パススルークエリの動的パラメータの指定方法をご教授いただきたいです。
よろしくお願いいたします!

環境は以下です。
SQLServer:microsoft SQL SERVER 2008 R2
Access:Access2007
ODBCデータソースを作成してSQLServerに接続しています。

「パススルークエリの動的パラメータの指定方」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (1件)

はじめまして、通りすがるというものです。


パススルークエリの方法ですが、パススルーでググってみると、以下のurlが検出されました。
http://support.microsoft.com/kb/303968/ja
これで、解決されるのでしょうか?
データ量が増えて、sqlserverに移行した。ということですが、今まで、クライアント側のアクセスを回線
を通して、dbから抽出したデータをクライアントに送信する形式となったのでそのネックで当然
レスポンスは落ちると思います。
また、氏名検索にて同一名が複数存在した場合(データ量増大により)サーバーとクライアントとの
データ量が増大しレスポンスが低下することが予想されるかと思います。
これらにより、パススルークエリによる(これはアクセス特有の機能? )レスポンスの改善はあまり
効果ないと思います。
レスポンス向上の方法として氏名のみの検索条件だけでなく、たとえば住所とか、生年月日などの
複合条件で検索することを検討したほうがよいかと思います。
複合条件で抽出件数を絞ることにより、サーバーからクライアントへのデーター送信量を絞るため
レスポンス向上を図れると思います。
これに合わせ、サーバー自体に付加がかかるのであれば、インデックスを追加するとかメモリ割り
当てなど、検討してはいかがでしょうか?

この回答への補足

別で新しく質問を投稿してみました。
よろしくお願いいたします!

補足日時:2014/02/28 15:09
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!

いただいたURLでパススルークエリを作ることはできたのですが
Accessで指定した条件でSQLServer側のデータを絞り込みする方法をお聞きしたかったです。
レスポンス改善はあまり見込めないとのことでしたが・・・
こうなったらやり方を学んでおきたいと思っています。

また検索条件を変更することは出来ません。
日々複数の人間でデータを登録,変更,削除等行っているので
インデックス作成は出来ません。

よろしければ引き続きよろしくお願いいたします!

お礼日時:2014/02/27 15:01

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESSでパススルークエリにパラメータを使用したい

毎度お世話になっております。
WindowsXP、Access2003、SQLServer2000を使用しております。

ADOでSQLServerからデータを抽出したいのですが、
パラメータを使用したいと考えております。

 SELECT CODE FROM テーブル1
 WHERE CODE = ?

とし
 adoCmd.CommandTimeout = 0
 With adoCmd
  .CommandText = strSQL
  .CommandType = adCmdUnknown
  .Prepared = False
  .Parameters.Refresh
 End With

 adoCmd.Parameters(0).Value = InputBox(Trim(strBuf))
 Set adoSet = adoCmd.Execute

とすることで動作しました。

しかしSQL文を下記に変更したところエラーになりました。
 SELECT t1.CODE FROM
 (SELECT CODE FROM テーブル1 WHERE CODE = ? ) as t1
 LEFT JOIN
 (SELECT CODE FROM テーブル2 WHERE CODE = ? ) as t2
 ON t1.CODE = t2.CODE

のようにすると、
 .Parameters.Refresh
の部分で

実行時エラー -21474672595(80004005)
構文エラーまたはアクセス違反です。

となってしまいました。

2つの?の内、片方を定数に、片方を?にしてもエラーになりました。
?を両方とも定数にすれば実行できました。

JOIN句がある場合に?を使ってはいけないのでしょうか。

何がエラーの原因かわからない状態です。
ご教授お願いいたします。

毎度お世話になっております。
WindowsXP、Access2003、SQLServer2000を使用しております。

ADOでSQLServerからデータを抽出したいのですが、
パラメータを使用したいと考えております。

 SELECT CODE FROM テーブル1
 WHERE CODE = ?

とし
 adoCmd.CommandTimeout = 0
 With adoCmd
  .CommandText = strSQL
  .CommandType = adCmdUnknown
  .Prepared = False
  .Parameters.Refresh
 End With

 adoCmd.Parameters(0).Value = InputBox(Trim(strBuf))
 Set adoSet = ad...続きを読む

Aベストアンサー

これかもしれません。
>http://support.microsoft.com/kb/829402/ja
PRB: SQLOLEDB でのパラメータ化クエリを実行すると、アクセス違反が発生します。

少し古いですが、仕様です。と書かれているので、今もそうなのかもしれません。
要はサブクエリ内にパラメータを切るとRefreshできないようです。
従って、代替策としてはRefreshでパラメータを自動生成させず、明示的に切ることになると思います。
(データ型と長さは必要に応じて変更)
With adoCmd
.CommandText = strSQL
.CommandType = adCmdUnknown
.Parameters.Append .CreateParameter("p1", adChar, adParamInput, 8)
.Parameters.Append .CreateParameter("p2", adChar, adParamInput, 8)
.Prepared = False
End With

なお、?が2つあるならパラメータは2つ必要です。

参考になることを祈ります。

これかもしれません。
>http://support.microsoft.com/kb/829402/ja
PRB: SQLOLEDB でのパラメータ化クエリを実行すると、アクセス違反が発生します。

少し古いですが、仕様です。と書かれているので、今もそうなのかもしれません。
要はサブクエリ内にパラメータを切るとRefreshできないようです。
従って、代替策としてはRefreshでパラメータを自動生成させず、明示的に切ることになると思います。
(データ型と長さは必要に応じて変更)
With adoCmd
.CommandText = strSQL
.Co...続きを読む

QAccessフォーム上の値を条件として、パススルークエリを実行する方法について

皆さんのお知恵を拝借致したく質問します。

AccessXP上でパススルークエリを使って、Oracleのデータをテーブルとして取得しています。
これをAccessフォーム上のテキストボックスで入力した値を元にデータを取得するようにしたいのですが、SELECT文中のWHERE条件にどのように組み込めば良いのか分からずに困っています。
このようなデータ取得は無理なのでしょうか。
ご教示のほど、お願いいたします。

Aベストアンサー

process9です。
パススルークエリを作る前に同じ内容の普通のクエリ(デザインビュー
でクエリを作成)画面で普通に作って
抽出条件を入力するところで、式ビルダを起動(右クリック-ビルド)
して、フォーム-全てのフォーム-作成したフォームを選択して、
真ん中の画面で入力ボックス、一番右の画面でtextを選択して
保存する寸前で、パススルー化すれば
お望みの内容になりませんか?

Qパススルークエリの使い方

Windows server 2003 + SQL server 2000の環境にあるDBがあります。
同じネットワーク上のWindows XP Pro + Access2000のPCからそのサーバのDBへデータをINSERTするのにはパススルークエリを使えという話になりました。
そのサーバへODBC接続の設定はできています。
パススルークエリの情報が乏しく、どのようにしたらよいのかちょっとわかりません。
どなたかご教授よろしくお願いいたします。

Aベストアンサー

#1です。やり方はわかったようですので、補足ですが、
パススルークエリは丸ごとSQL Serverにクエリを投げるので、
INSERT INTO (SQL Serverのテーブル) SELECT * FROM (Accessのテーブル)
みたいな使い方はできません。
基本的にはパラメータも渡すことができないので、実行の都度QueryDefのSQLを書き換えてExecuteするような使い方になるかと思います。

今回は1レコードだけということなので、特に問題はないと思いますが、複数レコードをINSERTするのだったら、
INSERT INTO TABLE VALUES ('A','B','C');
INSERT INTO TABLE VALUES ('D','E','F');
INSERT INTO TABLE VALUES ('G','H','I');

と並べるよりは
INSERT INTO TABLE
SELECT 'A','B','C'
UNION ALL SELECT 'D','E','F'
UNION ALL SELECT 'G','H','I'
とやると1ステートメントでINSERTできるので少し速いはずです。

#1です。やり方はわかったようですので、補足ですが、
パススルークエリは丸ごとSQL Serverにクエリを投げるので、
INSERT INTO (SQL Serverのテーブル) SELECT * FROM (Accessのテーブル)
みたいな使い方はできません。
基本的にはパラメータも渡すことができないので、実行の都度QueryDefのSQLを書き換えてExecuteするような使い方になるかと思います。

今回は1レコードだけということなので、特に問題はないと思いますが、複数レコードをINSERTするのだったら、
INSERT INTO TABLE VALUES ('A','B','C...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccessからストアドプロシジャ実行方法教えてください

Accessから、ODBC経由でOracle7のストアドプロシージャを実行するにはどのようにすればよろしいのでしょうか?

Aベストアンサー

データコントロールでOracleに接続しストアドプロシジャを実行するのは。
OptionsプロパティにdbSQLPassThroughを指定しRecordSourceプロパティのSQL文を直接SQLServerに解釈させるようにする。
直接SOLを投げる。SQL文はExecに続けてストアドプロシージャ名、パラメータの値です。
これで良いと思いますが。

QAccessの画面更新を一時的に停止する方法。

こんにちは。
Accessの画面更新を一時的に停止する方法を捜しています。
ExcelのScreenUpdatingと同様な機能です。

VBAでの更新処理時に画面がチラチラと動くのを防止したいと思っています。
(Ver:Access2000)
ご存知の方宜しくお願い致します。

Aベストアンサー

Application.Echo False '画面の描画を止める

・・・処理を実行する・・・

Application.Echo True '画面の描画を行う

QADOでRecordsetオブジェクトをレコードソースに設定したい

Access2000を使っています。リンクテーブルを使わずに、ODBCで繋いだDBのテーブルをフォームのレコードソースにセットしたいのですが、可能でしょうか。

宜しくお願いします。

Private Sub FormNoKansu()
Dim cn as New ADODB.Connection
Dim rs as New ADODB.Recordset
Dim strSql as String

'ODBCでサーバーに接続
cn.ConnectionString = "ODBCでMySQLに..."
...
strSql = "SELECT * FROM ..."
rs.Open strSql, cn

'ここに[rs]を入れられたらと思っています
Me.Recordset = ""

End Sub

Aベストアンサー

Set rs = New ADODB.Recordset
rs.Open strSql, cn, adOpenKeyset, adLockReadOnly

'フォームへ抽出レコードセット セット
Set Forms!["このモジュールを実行しているフォーム名"].Form.Recordset = rs

これでは如何でしょうか?

QAccessのマクロでモジュールを実行させたい。

Access2002を勉強中の初心者です。

AccessでDB1という名前のデータベースを作成し、その中で、モジュール1というモジュールを作成しました。これを実行するマクロを作成したく、次のようにマクロを作成しました。
マクロのデザイン画面でアクションに「プロージャの実行」を選択、プロージャ名入力覧の右側の...のボタンを押して式ビルダ画面を表示、ここの「関数」フォルダを開いてDB1を選択、表示されたモジュール1を貼り付けてOK。
しかし、このマクロを実行すると、次のエラーとなります。「DB1 指定されたDB1が見つけることができない関数名が含まれています」

根本的に方法が間違っているのでしょうか?
アドバイスをよろしくお願いします。

Aベストアンサー

#1です。

ちょっと時間ができたので、Accessのヘルプで、
 "RunCode/プロシージャの実行" アクション
についてのトピックを見てみました。

結論から言うと、基本的な考え方が間違っているみたいです^^;。

「プロシージャの実行」アクションでは、「Function」プロシージャを指定するようです。
Subプロシージャではエラーになります。


つまりご質問の件では、
「Subプロシージャを呼び出すFnctionプロシージャ」をまず書かなけれえばならない。
そして、マクロのアクションでは、あらためてこのFunctionプロシージャを指定しなければいけません。

QACCESS2013へのADPの対処方法

ACCESS2013から今までよく使っていた.ADPが一切使えなくなっています。 クラウド版のOFFICE365(ACCESS365)を使ってクラウドのSQLSERVER(SQLAZURE)を使えと言うことなのだろうと思うのですが、既存のADPをどうやって改良(記述変更)させれば使えるようになるのですか?  もし出来なかったらマイクロソフトにかなりのクレームがあるはずなのですが無いのでしょうか。

Aベストアンサー

SQLServerの方がOledbを廃止してODBC一本でいくことにしたので、ADPも廃止になったようです
http://msdn.microsoft.com/ja-jp/library/hh510181.aspx
私もADPのシステムが大量にあって困っていましたが、もうあきらめて、2010でひっぱりつつも、徐々にODBCに造り替えていこうと思っています。下記の記事を参考にしています。
http://foolexp.wordpress.com/2012/11/28/p2wpsu-5a/
VBAでゴリゴリやることになるので、そのうちVBAが廃止になったらお手上げですけどね。

QAccessとSQL Serverの連携について

現在Accessで組まれているデータベースがあるのですが、複数人で入力をする必要が出てきたため、SQL Serverへ移行したいと思っています。
ただ、まだデータベースの内容が完全にFIXしておらず、項目に変更や追加が発生する可能性があります。

そこで、
●Accessを管理画面として使い、
●Access上で内容を変更したら、システム全体もその通り変わる
ような仕組みを作りたいのですが、可能でしょうか。
(完全にSQL Serverへ移行するのではなく、AccessとSQL Serverを連携させる?)

よき方法がありましたら教えて頂けましたら幸いです。
ちなみにコストはあまり大きくはかけられません・・。
どうぞよろしくお願いします。

(※私はシステムはど素人なので、なるべく簡単に教えて頂けたら嬉しいです。なお、説明がおかしなこともあるかと思いますがご容赦ください。)

Aベストアンサー

>※私はシステムはど素人なので、なるべく簡単に教えて頂けたら嬉しいです。

でもやることは十分玄人の領域な気が…。なので簡単に、は不可能でしょう。
以下、#1さんと同じように、AccessファイルからSQLServerへデータ読込、書込する環境を構築することを目指します。違うのは概要だけ。#1さんはきちんとシステムを構築する方法を書かれていますが、私は概要だけ。なんで概要だけかは後述。

(1)SQL Server Expressをダウンロードして、サーバー(もしくはサーバーに見立てたPC)にインストール。
(2)Accessのテーブルを(1)のSQL Serverに作成。
(3)ここからはPC側の作業
(4)ODBC接続を作成
(5)現行のAccessに(4)を使ってリンクテーブル作成。
(6)(5)のAccess内のクエリ、フォーム、レポートなどを必要に応じた修正を行う。
(7)動作確認
(8)各PCにODBC接続を設定&Accessファイルを配布。

概要はここまでです。如何でしょう、ご自分でできそうですか?

作業の概要はこの通りなんですが、サーバー機の選定とか"細かい"作業はかなり省略…というか書いてません書けません。特に(6)は実際にAccessファイルを見ないときっちりアドバイスはできませんし、作業ボリュームや難易度も見えてきません。…ということで(業者への発注は想定外のようですがw)業者も見積には難渋するでしょう。さくっと見積もりが出てくることもあるでしょうけど、かなりバッファをとった高額なお見積りかと。正直、見積もり作るのにお金がほしい内容です。

どうしてこんなことをグチグチ書いているかというと、大変申し上げにくいのですが、自称素人の方には難易度高め。業者に任せるか、類似のパッケージを探された方が、不具合などのリスクも軽減され、業務への影響も少ないかと。

ご健闘をお祈りしております。

>※私はシステムはど素人なので、なるべく簡単に教えて頂けたら嬉しいです。

でもやることは十分玄人の領域な気が…。なので簡単に、は不可能でしょう。
以下、#1さんと同じように、AccessファイルからSQLServerへデータ読込、書込する環境を構築することを目指します。違うのは概要だけ。#1さんはきちんとシステムを構築する方法を書かれていますが、私は概要だけ。なんで概要だけかは後述。

(1)SQL Server Expressをダウンロードして、サーバー(もしくはサーバーに見立てたPC)にインストール。
(2)Accessのテー...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング