重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

先日質問した「選択したフィールドだけのCSVを出力」を作り込もうとしています。

テーブル名とフィールド名を管理するテーブルを作りました。
自動的に管理テーブルのメンテナンスをしたいと考えました。
その管理テーブルとSELECT文(sysobjects.name,syscolumns.nameを取り出す)
の間で同期を取る為に、ストアドを作ろうとしているのですが解りません。

要は、管理テーブルに有ってSELECT文に無いものを管理テーブルから削除。
(フィールドが消されたか名前が変えられた時)
管理テーブルに無くてSELECT文に有るものを管理テーブルに追加。
(フィールドが追加されたか名前が変えられた時)
この二点が出来れば同期が取れると考えていますが、サブクエリーにな
ると
思うのですがうまく作れません、ご教授をお願いします。

A 回答 (2件)

そうですか、ユーザの便宜のためのテーブルなわけですね。



SQL Server 2008でしたね。。
テーブルレイアウトがわからないので、以下でサンプルを書きますので、適当に加工してください。
CREATE TABLE テーブルレイアウト
([テーブル名][sysname],[フィールド名][sysname],[定義体名][nvarchar](50))

DECLARE @tablename sysname='テーブル1'
DECLARE @name nvarchar(50)='定義体1'

MERGE テーブルレイアウト t1
USING
(SELECT NAME FROM sys.columns
WHERE OBJECT_ID=OBJECT_ID(@tablename)) c
ON t1.テーブル名=@tablename AND t1.定義体名=@name AND c.NAME=t1.フィールド名
WHEN NOT MATCHED THEN INSERT VALUES (@tablename,c.NAME,@name)
WHEN NOT MATCHED BY SOURCE AND t1.テーブル名=@tablename AND t1.定義体名=@name THEN DELETE;
    • good
    • 0
この回答へのお礼

まだ、同期を取る前に別の問題で止まってます、別で質問を出しますので
こちらは一旦、締切ます。
進んで解らない場合は改めて質問をしますのでよろしくお願いします。、

お礼日時:2009/06/17 23:17

その管理テーブルの目的は何ですか?


・エクスポートできる対象のテーブルを絞りたい
・エクスポートできる対象のフィールドを絞りたい
前者だけであればフィールドを管理する必要はないですよね
後者も含むのであれば、無条件にフィールドを追加・削除したらまずくないですか?

また、いつ同期を取りたいのでしょうか?
・エクスポートが要求されたとき
・テーブルが変更されたとき
通常の発想ならば、後者かなとは思いますが。。

この回答への補足

一度エクスポートした設定を覚えておいて、次に同じテーブルが
指定されたら、その設定を表示させるためです。
(前回と同じ内容で良ければ、楽にエクスポート可能です)
さらに、管理テーブルに「定義体名」というフィールドを作成し、
設定内容を登録できる様にする予定です。
「定義体名」がブランクのレコードは前回の設定の記録。
「定義体名」が入っているレコードは名前をつけて保存した記録です。
当然、同一テーブル、同一フィールードが複数存在します。

よって、フィールドの加除があれば記録されているレコードに
反映(同期)させないとそのままでは、追加された項目が選べなかったり、
無くなった項目を選んでエラーになったりします。
(実際のテーブルからフィールドが無くなったのだから、無条件に
消さないと、選べたらまずいと考えています)

同期するタイミングは CSVを選択出力する画面でテーブルが
選択されたら、同期を取った上で指定されたテーブルの
「定義体名」がブランクのレコードをリストボックスへ表示します。

また、テーブルではなく「定義体」が呼び出されたら、その時点で
対象テーブルの同期を取った上で指定された「定義体名」が入った
レコードを同様に表示させます。

補足日時:2009/06/15 00:37
    • good
    • 0

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

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