SQL-Server Cursor dynamisch erzeugen

Hallo miteinander,
ich verzweifel langsam und im Netz kann ich nichts genaues finden. Folgendes Problem:

Ein System erzeugt mir im MS SQL-Server in einer Datenbank täglich eine neue Tabelle, die mit statistischen Daten gefüllt wird.
Name: Tabelle_DD_MM_YYYY

Nun will ich die Statistiken ausweiten, verändern und die täglich erstellte Tabelle in eine anderen Datenbank in eine einzige Tabelle kopieren.

Das Problem: da ich die Daten beim Kopieren verändern will, habe ich mich für eine stored procedure entschieden. Um die Daten nun also Entity für Entity zu transformnieren, will ich die neue Tabelle in einem Cursor haben.
Da nun die Tabelle jeden Tag einen neuen Namen trägt (DD_MM_YYYY = Datum) muss das ganze dynamisch geschehen und da liegt das Problem!

Ich habe schon so einiges Probiert (und leider wieder verworfen, sodass ich es hier nicht posten kann).
Meine aktuelle Version ist die Speicherung des Tabellennames in einer temporären Tabelle, damit der Select-String selbst nicht mehr dynamisch ist, nun ist er allerdings verschachtelt

DECLARE @curTable CURSOR FOR SELECT \* FROM (Select tablename FROM tablename)

Das gibt auch einen Fehler, weil er die Klammern nicht mag.
Hat hier schon einmal jemand solch eine Lösung programmiert? Wie kann ich die Daten in den Cursor bekommen?

System: MS SQL-Server 2000
Verarbeitung: Stored Procedure in der Datenbank selbst

Hallo,

in Oracle macht man so einen Müll mit Dynamic SQL.

Ob SQL-Server das auch kann, keine Ahnung. Aber mit der WITH RECOMPILE Option sollte es klappen, dass du die Tabelle über einen Parameter übergibst. Evtl musst du einen View definieren. (WITH RECOMPILE heisst soviel wie „Vernichte Performance“)

Versuchs doch einfach mal mit einem besseren Design:
Statt jedes mal eine neue Tabelle zu erzeugen, solltest du einfach ein Datumsfeld an eine dauerhafte Tabelle anhängen. Dann kannst du dein Problem ganz einfach lösen.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Das ist leider das Problem, dass ich die Originaldatenbank nicht verändern kann/darf, da es von einem gekauften Tool so gehandelt wird - mir gefällt es ja auch nicht.
Wie kann ich mir das mit dem „WITH RECOMPILE“ vorstellen?

Hallo,

in Oracle macht man so einen Müll mit Dynamic SQL.

Ob SQL-Server das auch kann, keine Ahnung. Aber mit der WITH
RECOMPILE Option sollte es klappen, dass du die Tabelle über
einen Parameter übergibst. Evtl musst du einen View
definieren. (WITH RECOMPILE heisst soviel wie „Vernichte
Performance“)

Versuchs doch einfach mal mit einem besseren Design:
Statt jedes mal eine neue Tabelle zu erzeugen, solltest du
einfach ein Datumsfeld an eine dauerhafte Tabelle anhängen.
Dann kannst du dein Problem ganz einfach lösen.

Gruß

Peter

Hallo,

die Lösung für dynamisches SQL heißt unter SQL-Server:

@str = ‚SELECT * FROM tabelle‘
EXECUTE @str

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Das Löst nur leider noch nicht das Problem, wie ich meine Tabelle in den Cursor bekommen.

[Exec(@str) müsste es sein]

Hallo,

die Lösung für dynamisches SQL heißt unter SQL-Server:

@str = ‚SELECT * FROM tabelle‘
EXECUTE @str

Gruß

Peter

Hallo,

das verstehe ich jetzt nicht. Du kannst dir doch den Cursor so zusammenbauen, wie du willst. Notfalls über eine Zwischentabelle, die du mit dem EXECUTE füllst.
Den Namen der Tabelle kannst du entweder in der Parameterliste übergeben oder zusammenbauen.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Peter,

das mit der Zwischentabelle kam mir auch schon in den Sinn, aber das ist wieder nochmal zusätzlicher Server-Aufwand, den ich vermeiden wollte. Es muss doch auch gehen, einen Cursor mit einem dynamisch erstellten quiry zu füllen. Das ist ja mein Problem, dass ich das nicht hinbekomme. Ich weiß nicht, wie ich das bauen muss. Ich habe auf einer Seite was gefunden und versucht umzusetzen, aber es funktioniert nicht:

DECLARE @curTable CURSOR Global
 EXEC sp\_executesql
 N'SET @curTable = \* FROM @dynBerechneteTable; OPEN @curTable',
 N'@curTable cursor OUTPUT', @curTable OUTPUT

Das soll den Cursor @curTable in einem extra batch-prozess füllen und am Ende eigentlich wieder ausgeben.
Allerdings wirft er als Fehler das ; in dem Tag aus, obwohl es da wohl sein muss. Im Anschluss sagt er, dass kein momentan Cursor mit @curTable allokiert hätte.

Ganz lieben Dank für deine Gedult - ich bin langsam echt schon verzweifelt, versuche das schon seit Donnerstag ordentlich hinzubekommen
mfg
Mathias

Hallo,

das verstehe ich jetzt nicht. Du kannst dir doch den Cursor so
zusammenbauen, wie du willst. Notfalls über eine
Zwischentabelle, die du mit dem EXECUTE füllst.
Den Namen der Tabelle kannst du entweder in der Parameterliste
übergeben oder zusammenbauen.

Gruß

Peter

Heureka
Hab es mit einem Kollegen jetzt doch hinbekommen, so muss es aussehen:

-- Variablen deklarieren
DECLARE @curTable cursor
DECLARE @str nvarchar(1024)
 
-- @str mit dem Select-Statment füllen (mit dem zuvor berechneten TableName, der Rest hinter dem Select ist für den Cursor in der sp\_executesql notwendig
SET @str = 'set @curTable = CURSOR FOR SELECT \* FROM ' + @tableName + '; OPEN @curTable'
 
-- sp\_executesql mit @sql und einem weiteren Parameter ausführen
EXEC sp\_executesql
 @str,
 N'@curTable cursor OUTPUT', @curTable OUTPUT
 
-- den Cursor durchgehen
FETCH NEXT FROM @curTable

Dankeschön für die Hilfe
Mathias :o)