Announcement

Collapse
No announcement yet.

Fehlerbehandlung im SQL Server 7 beim Ausführen von Strings

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fehlerbehandlung im SQL Server 7 beim Ausführen von Strings

    Hallo!

    Ich habe folgendes Problem:
    Eine Fehlerbehandlung nach dem Ausführen einer String-Variable die ein SQL-Statement enthält wird ignoriert.

    Beispiel:

    create table x (x1 smallint)
    insert into x values (1)
    If @@error <> 0
    begin
    ...
    end

    Hier gibt es keine Probleme, aber im folgenden Fall

    declare @anweisung as varchar(100)
    create table x (x1 smallint)
    set @anweisung = 'insert into x values (1)'
    exec(@anweisung)If @@error <> 0
    begin
    ...
    end

    In diesem Fall wird die Fehlerbehandlung ignoriert.
    Relevant ist dies, wenn beispielsweise Tabellen oder Datenbanken dynamisch angesprochen werden sollen. Beispiel:
    set @abfrage = 'insert into '+@datenbank+'.dbo.x values (1)'
    exec(@abfrage)

    In der Onlinedokumentation steht nichts zu dieser Form der Fehlerbehandlung.

    Ist dieser Fehler bekannt und kann mir jemand helfen?

    vielen Dank!

    Holger Möller

  • #2
    Ich denke mal Du wirst auf jeden Fall einen Service-Pack für den SQL-Server installiert haben (Pflicht ist auf jeden Fall SP 1). Ohne Service Pack sind bei Triggern/SP's sehr viele Fehler zu erwarten

    Comment


    • #3
      Es ist derzeit SP 2 installiert, hat aber anscheinend darauf keine Auswirkungen

      Comment


      • #4
        Korrektur: Es ist doch bereits Service Pack 3 installiert

        Comment


        • #5
          Hallo,

          der Wert von @@ERROR wird nach jeder T-SQL-Anweisung neu gesetzt, im Fall von EXEC sind jedoch 2 Anweisungen betroffen: <br>
          a) SQL-Anweisung in der Zeichenkette, <br>
          b) EXEC-Anweisung<br>
          Wenn der Aufruf zurückkehrt, enthält @@ERROR nur den Statuswert von EXEC, aber nicht mehr den Fehlerwert der abgesetzten Anweisung. Ich würde daher anstelle der INSERT-Anweisung eine Batch-Anweisung ausführen zu lassen und den @@ERROR-Wert in eine eigene Variable zu retten:
          <pre>
          DECLARE @iError INT, @iRowCount INT
          INSERT INTO ErrorTest (Wert2) VALUES (1)
          SELECT @iError = @@ERROR, @iRowCount = @@ROWCOUNT
          </pre&gt

          Comment


          • #6
            Hallo!

            Vielen Dank erstmal für die Hilfe!

            Ich hatte in der Zwischenzeit schon den Verdacht, dass bei exec zwei Anweisungen betroffen sind. Der Vorschlag mit der Batch-Anweisung ist gut (danke!), doch leider habe ich noch ein Problem damit. Wenn ich das obige Beispiel komplett einem String zuweise und den dann ausführe enthält @iError den Fehlercode, allerdings ist die Variable außerhalb der EXEC-Anweisung nicht bekannt. Auch nicht, wenn ich sie außerhalb als globale Variable (@@iError) definiere. Meine Fehlerbehandlung ist etwas komplexer, so dass ich sie nicht auch in den String einfügen möchte.

            Kann mir jemand sagen, wie ich den Fehlercode auch außerhalb abfragen kann? Sollte ich den Wert vielleicht in eine temporäre Tabelle schreiben lassen (die EXEC-Anweisung steht in einer Schleife)?

            Vielen Dank im voraus!

            MfG

            Holge

            Comment

            Working...
            X