2017-07-22 2 views
0

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] 
+0

Ja. Sie können solche Variablen nicht verwenden. Sie müssen dynamisches SQL zum Ersetzen von Bezeichnern in Abfragen verwenden. –

+0

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

+0

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

Antwort

1

Nun, da Sie nur die erste Zeile bekommen können Sie die verschachtelten Cursor beseitigen und es sollte das tun, was Sie wollen:

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 

    SET @COLUMN = (SELECT Top 1 Column_name FROM 
postfixing.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME [email protected] order by 
column_name) 

    PRINT @TABLE+' '[email protected] 
    --UPDATE @TABLE SET @[email protected] 

FETCH FROM [TABLE] INTO @TABLE 
END 
CLOSE [TABLE] 
DEALLOCATE [TABLE] 
+0

Eine Kombination aus diesem und dynamischem SQL zum Festlegen des Tabellennamens in der Update-Anweisung hat meine Probleme gelöst. Danke JM_ und Gordon Linoff, dass Sie mir dabei geholfen haben. Ich habe noch ein paar Fragen darüber, warum es diese Probleme gab, aber ich kann das wahrscheinlich von hier aus herausfinden. – ThexTallxDude

Verwandte Themen