2017-04-24 6 views
0

Ich habe nach einer Antwort zu diesem gesucht aber nicht sicher, ob ich nach den korrekten Bedingungen gesucht habe?Daten aus angegebenen Tabellennamen auswählen?

Ich hoffe, jemand kann helfen?

Ich habe eine Abfrage, die wie diese

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

sieht das mir eine Liste aller Tabellen in der Datenbank gibt. Diese Tabellen enthalten genau dieselben Spalten/Daten, es wird jedoch jeden Monat eine neue Tabelle erstellt, die die neuesten Daten einholt.

Wäre es möglich, etwas zu schreiben, das automatisch all diese Tabellen vereint, wenn es ausgeführt wird? Zum Beispiel würde ich es am Ende dieses Monats laufen lassen und es würde eine Ausgabe produzieren, die alle Tabellen unioned einschließlich der letzten Tabelle enthält, die an diesem Morgen produziert wurde?

Ich hoffe, jemand kann helfen?

Vielen Dank :)

+0

Sie würden dies tun, indem Sie einen Job- oder DDL-Trigger einrichten, der eine Ansicht neu definiert, die die Tabellen kombiniert. Es ist jedoch sinnvoller, den Job zu ändern, der die Tabellen tatsächlich erstellt, um die Daten auch in eine einzelne Tabelle mit einer Spalte für den Ausführungsmonat zu übertragen. –

+0

Ich stimme der Änderung des Jobs zu, jedoch kommen sie aus einer anderen Abteilung, so dass wir keine Kontrolle darüber haben, wie wir sie erhalten. Wie würde mein Code aussehen, der die Ansicht neu definiert? Ich wäre in der Lage, eine Ansicht zu erstellen, die alle Tabellen unioned hat, wenn ich den Tabellenname manuell gebe, aber ich möchte, dass sie sie automatisch vereinigt. Wenn eine neue Tabelle hinzugefügt wird, wird sie automatisch in die Union aufgenommen, ohne dass ich sie angeben muss. – jd8766

Antwort

0

Sie konnten die SQL dynamisch über einen Cursor generieren (was wirklich nicht schlecht leistungsmäßig sein wird, da es nur durch so viele Tabellen iterieren, wie Sie haben - eine pro Monat, 12 pro Jahr - nicht so schmerzhaft) und dann diese dynamische Abfrage ausführen.

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 

Hinweis: Statt SELECT * ich ausdrücklich die Auswahl der Namen der Spalten gehen würde, wenn die @sql Zeichenfolge für UNION verketten.

+0

Vielen Dank für diese Rigerta. Schnelle Frage - wenn ich die Ausgabe von diesem in eine andere Tabelle setzen möchte, wo würde ich meinen Code setzen? Ich habe eine Insert-Abfrage in der dynamischen SQL versucht, aber es scheint nicht zu funktionieren? – jd8766

+0

Ich habe die Antwort bearbeitet und eine neue Variable namens @sqlInsert hinzugefügt, die dynamisch erstellt wird, wenn der Cursor fertig ist und die INSERT INTO-Abfrage gespeichert wird. Sie können dann die letzte ausführen, aber Sie müssen den Namen Ihrer Tabelle angeben. Sie können den Tabellennamen auch parametrisieren. –

Verwandte Themen