アプリ版:「スタンプのみでお礼する」機能のリリースについて

ビュー定義をプログラムで動的に扱う方法
SQLServer2008+VB6(ExcelVBA)構成のシステムで、日付フィールドを含むテーブルのビューを作成しておき、VBプログラムからSQL文でビューを呼び出す時、日付範囲を指定して絞り込まれた結果をビューで返したいのですが、ストアドを使わずにビューだけで実現することはできないでしょうか?

A 回答 (3件)

#2です。



>Set Cmd = New ADODB.Command
>Cmd.CommandText = ”CREATE VIEW ビュー AS SELECT * FROM テーブル WHERE 日付='2010/07/09'”
>Cmd.Execute

もちろん、権限があればできます。

しかし、そのリクエストをした人にもう一度確認することをお勧めします。
私もVB内で10行以上のクエリを組み立てて実行しているのを見てげっそりすることはありますので、
「長いクエリはビューで管理したい」というリクエストは理解できます。

ただ、本当に「パラメータまで含めて一切をビューにし、すべてWHERE文の一切ないSELECT * FROM ビューだけにしたい」
というリクエストをしたとすれば、その人はシステムのことを理解していないので、説明すべきだと思います。

・同時に複数のユーザ・複数の処理でビューを参照できなくなるので、ユーザ数×処理数だけ同じようなビューが必要
・ビュー定義の一部だけを再作成することはできないので、再作成には常に全部を実行する必要がある。処理はわかりやすくならない
    • good
    • 1
この回答へのお礼

遅くなりまして申し訳御座いません。
何とか解決の糸口が見えました。
この度は有難う御座いました。

お礼日時:2010/07/23 09:37

パラメータを受け取るビューに相当するものとして、インラインテーブル関数がありますから、これを利用するのも一案です。



CREATE FUNCTION テーブル関数(@日付 datetime)
RETURNS TABLE
AS
RETURN
SELECT * FROM テーブル WHERE 日付=@日付

ただ、日付指定は行っているのに、ビューの中で絞り込みたいという質問の理由が、
「データが多いため、ビューの外側で条件を指定すると、時間がかかりすぎる(と思う)」であるならば、オプティマイザは優秀なので、条件を切る場所がビューの外でも、ビューの中でも実行プランは基本同じになります。
(もちろん、常に同じ、ではありません)

例えば、
CREATE VIEW ビュー
AS
SELECT * FROM テーブル WHERE 日付='2010/07/09'
GO

CREATE FUNCTION テーブル関数(@日付 datetime)
RETURNS
TABLE
AS
RETURN
SELECT * FROM テーブル WHERE 日付=@日付
GO

a) SELECT * FROM テーブル WHERE 日付='2010/07/09'
b) SELECT * FROM ビュー
c) SELECT * FROM テーブル関数('2010/07/09')

上記3つのクエリの実行プランは同じになるはずです。

この回答への補足

早速のご回答有難うございます。

普段は下記の様なソースを利用してレコードセットで結果を受け取るような方法を実現しております。

Set Cn = New ADODB.Connection
Cn.Open ODBC_Name

Set Rs = New ADODB.Recordset
Sql = "SELECT * FROM データ Where 日付='2010/07/07'"
Rs.Open Sql, Cn

CREATE VIEW などのコマンドはDOSプロンプト画面やバッチファイルなどからしか利用したことが無いのですが、

Set Cmd = New ADODB.Command
Cmd.CommandText = ”CREATE VIEW ビュー AS SELECT * FROM テーブル WHERE 日付='2010/07/09'”
Cmd.Execute

などといった使用ができるということでしょうか?

補足日時:2010/07/09 23:35
    • good
    • 0
この回答へのお礼

遅くなりまして申し訳御座いません。
何とか解決の糸口が見えました。
この度は有難う御座いました。

お礼日時:2010/07/23 09:38

SELECT文でWhere句を指定するのではダメな理由があるのでしょうか。


VBプログラムがWHERE句を指定できないのですか?


あえてやろうとするなら、以下が考えれます。
(1)毎回Viewを定義しなおす。
alter view view_name as select * from table_name where col1=yyyymmdd

(2)条件テーブルを作成しておき、ジョインさせる。
条件を変えたいときは条件テーブルの日付を変更する。
create view view_name as select a.* from table1 as a
inner join table2 as b on a.col_date = b.col_date;

正直、明確な理由がないなら、SELECT文にWHERE句をつけて発行するのが普通だと思います。

>VBプログラムからSQL文でビューを呼び出す時、日付範囲を指定して絞り込まれた結果をビューで返したいのですが、
毎回、日付をしていするなら、where col_date = 'yyyy/mm/dd hi:mi:ss'とWHERE句をつけるだけだと思います。これが出来ない理由があるのですか?

この回答への補足

早速の御回答をありがとうございます。
普段はビューを使わずに、VBソース内で下記のようなコードを直接記述・実行して利用しています。

Set Cn = New ADODB.Connection
Cn.Open ODBC_Name

Set Rs = New ADODB.Recordset
Sql = "SELECT * FROM データ Where 日付='2010/07/09'"
Rs.Open Sql, Cn

ところが ”VBは理解できるけれどもSQLは苦手” という人が、
1、SQL文をビューに置き換えて、どんな事をしているのかビジュアル的に把握できるようにしたい。
2、あらかじめ作成されているビューをコールする様にしておき、VB側の構造は理解した上で、
SQLの簡単な修正・変更は自分たちでビューを変更して出来るようにしたい。

などという要望があり、このような問い合わせをさせて頂きました。

補足日時:2010/07/09 23:29
    • good
    • 0
この回答へのお礼

遅くなりまして申し訳御座いません。
何とか解決の糸口が見えました。
この度は有難う御座いました。

お礼日時:2010/07/23 09:37

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

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