2017-04-24 38 views
0

私は正しい条件を探していたのかどうかわかりませんが、これに対する答えを探しましたか?指定したテーブル名からデータを選択しますか?

誰かが助けてくれることを願っていますか?

私はこれは私のデータベース内のすべてのテーブルのリストが表示されます。この

select name 
from CDSArchive.sys.tables 
where name like '%OPARDENTIA%' 
    and create_date >= '01 apr 2016' 
ORDER BY create_date DESC 

のように見えるのクエリを持っています。これらのテーブルには同じ列/データが含まれていますが、毎月新しいテーブルが作成され、最新のデータが取り込まれます。

実行時にこれらのテーブルをすべて自動的に結合するものを書くことは可能でしょうか?たとえば、今月末にそれを実行したいと思います。それは、今朝作成された最新のテーブルを含め、すべてのテーブルが結合された出力を生成しますか?

誰かが助けることを願っていますか?

多くの感謝:)

+0

これは、テーブルを組み合わせたビューを再定義するジョブまたはDDLトリガを設定することで行います。ただし、実際にテーブルを作成するジョブを変更して、実行月の列を含む単一のテーブルにデータを配置する方が理にかなっています。 –

+0

私はジョブを変更することに同意しますが、別の部門から来ているので、私たちはそれを受け取る方法を支配していません。ビューを再定義すると、私のコードはどのように見えますか?手動でテーブル名を入力すると、すべてのテーブルが結合されたビューを作成することができますが、テーブルを自動的に結合する必要があります。新しいテーブルが追加されると、それを指定せずに自動的にユニオンに追加されます。 – jd8766

答えて

0

あなたが持っているとして、それが唯一のように多くのテーブルを反復処理しますので、あなたは、動的性能面は本当に悪いことではありません、カーソルを(使用してSQLを生成することがありました - 月額1を、12それほど痛いわけではありません)、その動的クエリを実行します。

declare @tableName varchar(100), @sql nvarchar(max) = '', @sqlInsert nvarchar(max) = '' 

declare sqlcursor cursor for 
select name 
from sys.tables 
where name like '%OPARDENTIA%' and create_date >= '01 apr 2016' 
order by create_date desc 
open sqlcursor 
fetch next from sqlcursor into @tableName 
while @@fetch_status = 0 
begin 

    if @sql != '' set @sql += ' union all ' 
    set @sql += ' select * from ' + @tableName 

fetch next from sqlcursor into @tableName 
end 
select @sql 
close sqlcursor 
deallocate sqlcursor 

set @sqlInsert = 'insert into YourNewTable select * from (' + @sql + ') as t' 
select @sqlInsert 

注:代わりにSELECT *の私はUNIONため@sql文字列を連結するとき、明示的に列の名前を選択するために行くだろう。

+0

ありがとうございました。クイック質問 - 私はこのコードの出力を別のテーブルに入れたいのですが?私は動的SQLで挿入クエリを試したが、それは動作していないようですか? – jd8766

+0

答えを編集して、@ sqlInsertという新しい変数を追加しました。この変数は、カーソルが終了し、INSERT INTOクエリを保存するときに動的に作成されます。最後のテーブルを実行できますが、テーブルの名前を指定する必要があります。テーブル名もパラメータ化できます。 –

関連する問題