2009-06-16 2 views
0

私はストアドプロシージャを使用していくつかのデモデータを転送するためのきれいな方法を探しています。転送したいデータは日付タイプです。私のアプリの性質上、私のアプリの一部のデータは、データ内の特定の日付が将来表示される場合にのみ表示されます。私はこれが理にかなってほしい。 :Sストアドプロシージャを使用してデモデータ日付を転送する方法はありますか?

データベースが拡張されて以来、デモユーザーアカウントに属するデータベースのすべてのテーブルにすべての日付を転送するストアドプロシージャを作成することを考えていました。デモデータが最後に転送された日付も記録します。ストアドプロシージャは、デモデータのログイン時に実行され、デモデータが転送された最後の日付と現在の日付との間の差異が一定の時間差(30日など)を満たしている場合は明らかです。こうすることで、スクリプトを変更する必要はありません。技術的な部分に今

私は、DB内のすべてのテーブルを取得するために、これを使用しています:

Select 
    table_name 
from 
    Information_Schema.Tables 
Where 
    TABLE_TYPE like 'BASE TABLE' 
    and table_name not like 'Report_%' 
    and table_name not in ('Accounts', 'Manifest', 'System', 'Users') 

私は必要なものは、列を見つけ、テーブル名を反復処理するための方法です名前と列の種類。次に、datetime型の各テーブルのすべての列を更新したいとします。私はSQLでのループは理想的ではありませんが、これをサーバサイドのコードに置くのではなく、データベース呼び出しの数を最小限に抑えたいと思っています。

私はこの問題を解決するために間違った道を歩いていますか?

ありがとうございます。

+1

どの列を先験的に増分する必要があるか分かりませんか?あなたのスキーマのすべての日付を30日までにプッシュするのは悪い考えです。誰かが来て、増分するべきではない日付列を追加すればどうなるでしょうか? –

+0

私はJPと一緒です。データは常に変化しているので、列を変更することはできませんか?また、MySQLまたはSQL Serverを使用していますか?両方とも、内部の仕組みに関するメタデータが非常に異なっていると考えています(つまり、日時フィールドを指定する方法)。 – Eric

答えて

0

これを自動的かつ非表示にするのは良い考えではないかもしれないが、これを使うことができるという意見に同意する。

(これは、SQL Serverを前提としています)

select T.Name, C.Name 
from sys.tables T 
join sys.columns C 
on T.object_id = C.object_id 
and C.system_type_id = 61 -- I would do a little researcht o make sure 61 is all you need to return here 

これは名前によってであるテーブルと一緒に、あなたのすべてのdatetime列のリストを取得します。

は、その後、私はそれを達成するような方法は、その場で更新文字列を構築し、カーソルを持っており、それらをexecしことですが、ちょっと好き:

DECLARE @UpdateString varchar(500) 
DECLARE @DaysToAdd int 
DECLARE @TableName VARCHAR(100) 
DECLARE @ColumnName VARCHAR(100) 

set @DaysToAdd = 10 

DECLARE db_cursor CURSOR FOR 
select T.Name, C.Name 
from sys.tables T 
join sys.columns C 
on T.object_id = C.object_id 
and C.system_type_id = 61 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @TableName, @ColumnName 

WHILE @@FETCH_STATUS = 0 
BEGIN 
set @UpdateString = 'Update ' + @TableName + ' set ' + @ColumnName + ' = dateadd(dd, ' + cast(@DaysToAdd as varchar) + ', ' + @ColumnName + ') where ...' 
exec(@UpdateString) 
    FETCH NEXT FROM db_cursor INTO @TableName, @ColumnName 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 

私はこれについて好きではない多くのものがありますが、カーソル、事実の背後にある事実、execコール、そしてデータベース内の汎用テーブルのwhere句を書くことは非常に難しいので、私はあなたがどのように "テストデータのみを更新するか"は不明です。しかし、私はそれがあなたを始めさせると思う。

おそらく、あなたの日付要件を満たす新しいデータを挿入するために実行できるいくつかのテストデータ挿入スクリプトがあると考えるべきです。

関連する問題