SQL Abfrage in variabler Tabelle?

... komplette Frage anzeigen

5 Antworten

Das geht nichtmal mit Stored Procedures so wie du dir wünscht. Ich würde dir empfehlen, dass du die ganzen "Daten_xyz123" Tabellen in eine einzelne Tabelle zusammenführst, in der halt die Daten aus den einzelnen Tabellen und eine neue Spalte mit der ZählerID drinsteht. Das lässt sich mit einem SP bewerkstelligen.

Erstelle eine Tabelle mit dem Namen "Daten_Gesamt" und den Feldern ZählerID, ID, Zeitpunkt, Zählerstand

Wenn ich keinen Fehler gemacht habe, müsstest du die Tabelle mit dieser Prozedur füllen können (der hat die einzelnen Zeilen auseinandergerissen. Musst die halt alle reinkopieren):

-- temporäre Tabelle erstellen
DECLARE @tblNames AS TABLE(tblNr int, tblName nVarChar(50));
-- temporäre Tabelle mit Tabellennamen füllen
INSERT INTO @tblNames(tblNr, tblName)
SELECT ROW_NUMBER() OVER (ORDER BY name) AS RowNr, name 
FROM sys.objects 
WHERE type = N'U' AND name like N'Daten_%';
-- Steuervariablen erstellen
DECLARE @i int = 1;
DECLARE @SQL nvarchar(max);
DECLARE @maxRow int;
DECLARE @ZaehlerID nvarchar(10);
-- Schleife über alle gefundenen Tabellen. Die Daten werden in die Tabelle "Daten_Gesamt" geschrieben.
SET @maxRow = (SELECT MAX(tblNr) AS MaxRowNr FROM @tblNames)
WHILE @i <= @maxRow
BEGIN
SET @ZaehlerID = SUBSTRING((SELECT tblName FROM @tblNames WHERE tblNr = @i), 7, 10)
SET @SQL = N'
INSERT INTO Daten_Gesamt(ZählerID, ID, Zeitpunkt, Zählerstand)
SELECT N''' + @ZaehlerID + N''' AS ZählerID, ID, Zeitpunkt, Zählerstand
FROM Daten_' + @ZaehlerID + N';';
EXEC sp_sqlexec @SQL;
END
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von nstuebner
09.12.2015, 13:30

Aber brauche ich zum Erzeugen der temporären Zwischentabelle nicht Schreibrechte? Ich habe leider nur einen lesenden Zugriff.

0

habe grade kein Studio zurhand.

wenn ich es richtig verstanden habe hast du nur die drei Tabellen

dann würde es so gehen

select top 1 Zähler1, Datum, Stand from Zähler order by Datum desc 

union all

select top 1 Zähler1, Datum, Stand from Zähler order by Datum desc

union all

select top 1 Zähler1, Datum, Stand from Zähler order by Datum desc

alternativ könntest du auch ein where datum = ( select max(datum) from Zähler) nehmen, musst du schauen was schneller ist.

Antwort bewerten Vielen Dank für Deine Bewertung

Funktioniert "...Zeitpunkt FROM 'Daten_' || Zähler.ID..." nicht?

Probier mal, die Tabelle als Zeichenkette zusammen zu setzen, von der du lesen willst.

1. Schritt: 'Daten_xc8f9g3'
2. Schritt: 'Daten_' || 'xc8f9g3'
3. Schritt: 'Daten_' || Zähler.ID

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Suboptimierer
09.12.2015, 11:34

Such nach einer Verkettenfunktion in deiner SQL. Es gibt u. a. concat und +.

0

Hast du dich mal mit JOINS beschäftigt? Die wären da hilfreich.

Antwort bewerten Vielen Dank für Deine Bewertung

OK,
anscheinend gibt es keine richtige Lösung, wenn man nur Lese-Rechte hat.

Ich habe es nun so gelöst, dass ich im ersten Schritt alle ZählerIDs auslese und daraufhin zu jedem Zähler eine einzelne Abfrage starte.

Vielen Dank für eure zahlreichen Antworten!

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?