Ich verwende verschachtelte Cursor, um die erste Spalte in jeder Tabelle meiner Datenbank zu aktualisieren, um Daten für ein Online-Reporting-Programm zu füllen.Geschachtelte SQL-Cursor druckt Variablen, aber wird nicht aktualisiert
beim Testen meiner Cursor mit einer print-Anweisung, alles läuft gut. Wenn ich zum Update-Befehl wechsel, erhalte ich eine Fehlermeldung, dass die Variable @table definiert werden muss. Warum funktioniert die Variable nur für einen Druck, und wie kann ich das korrekt machen?
declare @table varchar (30)
declare @Column varchar (30)
DECLARE [TABLE] CURSOR FOR SELECT TABLE_NAME FROM
postfixing.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' order
by table_name
OPEN [TABLE]
FETCH FROM [TABLE] INTO @TABLE
WHILE @@FETCH_STATUS=0
BEGIN
DECLARE [COLUMN] CURSOR FOR SELECT Top 1 Column_name FROM
postfixing.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME [email protected] order by
column_name
OPEN [COLUMN]
FETCH FROM [COLUMN] INTO @COLUMN
WHILE @@FETCH_STATUS=0
BEGIN
PRINT @TABLE+' '[email protected]
--UPDATE @TABLE SET @[email protected]
FETCH FROM [COLUMN] INTO @COLUMN
END
DEALLOCATE [COLUMN]
FETCH FROM [TABLE] INTO @TABLE
END
DEALLOCATE [TABLE]
Ja. Sie können solche Variablen nicht verwenden. Sie müssen dynamisches SQL zum Ersetzen von Bezeichnern in Abfragen verwenden. –
Ich entschuldige mich für jede Ignoranz, aber ich habe meine Update-Anweisung als eine Variable mit (ich denke) dynamischen SQL. Das Problem, das ich jetzt habe, ist, dass es die erste Tabelle überspringt und nun versucht, die zweite Tabelle mit den Spalten für die erste zu aktualisieren. Es sieht so aus, als ob der äußere Cursor die erste Tabelle durchläuft, aber er springt nie ein, um die Spalte – ThexTallxDude
zu aktualisieren. Ein weiterer Fall von _optimistischer Programmierung_. Sie möchten 'UPDATE @TABLE SET @ COLUMN = @ COLUMN 'tun, was Sie wollen _want_. Manchmal sollte '@ COLUMN' eine Variable sein und der Wert sollte verwendet oder gesetzt werden. Zu anderen Zeiten sollte der Wert in eine Anweisung eingefügt werden, dann wird die Anweisung repariert (vielleicht rekursiv). Also was würde 'SET @ COLUMN = @ COLUMN 'bedeuten? 'SET [MyFirstColumn] = [MyFirstColumn]'? 'SET [MyFirstColumn] = 'MyFirstColumn''? Oder einfach 'SET @COLUMN = @ COLUMN'? [sp_executesql] (https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql)? – HABO