"IF NOT EXISTS" Insert Statement Rückgabewert

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

  • "IF NOT EXISTS" Insert Statement Rückgabewert

    Hallo zusammen,

    ich benutze MSSQL und PHP und habe mit folgendem Statement ein Problem:

    $msquery = IF NOT EXISTS (SELECT SerienNr FROM tbl_Auftrag a WHERE a.SerienNr='PC8') INSERT INTO tbl_Auftrag (BMS_AuftragsNr, SerienNr, AuftraggNr, Zieltermin, Kd_Name) VALUES ('455476567','PC8','1','2006-3-2','Fritz')

    Das Statement an sich läuft prima, es gibt also keine Fehlermeldung. Allerdings gibt mssql_query() dann ja auch immer true zurück, ganz egal, ob der Insert stattgefunden hat oder nicht. Ich bräuchte allerdings die Information, ob der Insert erfolgreich war oder nicht. Deshalb hab ich versucht das ganze über num rows oder affected rows zu realisieren, um herauszufinden, ob es einen Insert gab oder nicht:

    $result = mssql_query($msquery);
    $succeed = mssql_rows_affected ($result);

    oder:

    $result = mssql_query($msquery);
    $succeed = mssql_num_rows($result);

    Allerdings geben beide die selbe Fehlermeldung zurück:

    supplied argument is not a valid MS SQL-Link resource

    Hat jemand ne Idee, was ich falsch gemacht habe, oder wie ich durch einen Rückgabewert herausfinden könnte, ob der Insert stattgefunden hat oder nicht?

    PS: Bei einem reinen SELECT Statement funktioniert mssql_num_rows übrigens komischerweise.....

  • #2
    Re: "IF NOT EXISTS" Insert Statement Rückgabewert

    Original geschrieben von Falco1980
    Allerdings geben beide die selbe Fehlermeldung zurück:

    supplied argument is not a valid MS SQL-Link resource
    Natürlich, du bekommst ja auch keine Link resource zurück, sondern ein TRUE - das hast du doch selber bereits festgestellt.
    Auf TRUE mssql_num_rows() oder mssql_affected_rows() anwenden zu wollen, ist aber Unfug.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Comment


    • #3
      ansonstens gibt dir mssql_get_last_message() gern Auskunft drüber

      Comment


      • #4
        Natürlich, du bekommst ja auch keine Link resource zurück, sondern ein TRUE - das hast du doch selber bereits festgestellt.
        Bei einem reinen SELECT Statement z.b.:

        query = SELECT * from tbl_Auftrag where SerienNr = 'PC8'

        gibt mssql_query() ja auch ein true zurück. Aber da bekomme ich bei Anwendung von mssql_num_rows() die Anzahl angezeigt. Beim Insert allerdings nicht.

        Mit mssql_affected_rows() bekomme ich nie ein Ergebnis, egal bei welchem Statement.

        ich bräuchte einfach eine Möglichkeit festzustellen, ob der Insert stattgefunden hat, oder nicht, also einen Rückgabewert des Statements.

        Comment


        • #5
          Original geschrieben von asp2php
          ansonstens gibt dir mssql_get_last_message() gern Auskunft drüber
          Bei mir gibt mssql_get_last_message() also:

          $result = mssql_query($msquery);
          $meldung = mssql_get_last_message (void);
          echo $meldung;

          Folgende Ausgabe:

          Changed database context to 'Lagerliste'.

          Comment


          • #6
            Original geschrieben von Falco1980
            Bei einem reinen SELECT Statement z.b.:

            query = SELECT * from tbl_Auftrag where SerienNr = 'PC8'

            gibt mssql_query() ja auch ein true zurück.
            Nein, tut es nicht.

            Zitat Manual:
            Gibt bei Erfolg eine Ergebnis-Kennung zurück, TRUE, falls kein Datensatz zurückgegeben wurde oder FALSE bei Auftreten eines Fehlers.
            Aber da bekomme ich bei Anwendung von mssql_num_rows() die Anzahl angezeigt.
            Wenn du eine gültige Resource-ID hast - ja, fein, works as designed.
            Beim Insert allerdings nicht.
            Natürlich nicht - weil du da ja von mssql_query() keine Resource-ID zurückbekommen hast, sondern ...?

            Genau, ein TRUE. Aber langsam drehen wir uns hier im Kreis, hm?
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Comment


            • #7
              OK, ich geb dir recht. mssql_query() gibt bei Erfolg eine positive Ergebnis-Kennung oder, bei Auftreten eines Fehlers, FALSE zurück. Aber genau da liegt ja auch mein Problem:

              $msquery = IF NOT EXISTS (SELECT SerienNr FROM tbl_Auftrag a WHERE a.SerienNr='PC8') INSERT INTO tbl_Auftrag (BMS_AuftragsNr, SerienNr, AuftraggNr, Zieltermin, Kd_Name) VALUES ('455476567','PC8','1','2006-3-2','Fritz')

              Mit "IF NOT EXISTS" wird überprüft, ob sich PC8 bereits im tbl_Auftrag befindet. Wenn nicht, wird EIN Insert gestartet, falls doch, wird KEIN Insert durchgeführt.

              In beiden Fällen gibt mssql_query() das selbe zurück. Wie kann ich jetzt unterscheiden, ob der Insert stattgefunden hat oder nicht. Das ist ja mein eingetliches Problem, denn ich möchte später im Skript ausgeben, ob der Insert geklappt hat, oder nicht. Verstehst du wie ich meine?

              Comment


              • #8
                Mach doch einfach nochmal ein SELECT nach exakt dem Datensatz, den du eben geINSERTed hast. Ist er da, hats geklappt oder er war vorher schon genau so drin und dann hätte ein INSERT eh nix bewirkt.

                Comment


                • #9
                  Original geschrieben von onemorenerd
                  Mach doch einfach nochmal ein SELECT nach exakt dem Datensatz, den du eben geINSERTed hast. Ist er da, hats geklappt oder er war vorher schon genau so drin und dann hätte ein INSERT eh nix bewirkt.
                  Das ginge theoretisch, klar. Allerdings ist die Variante nicht sonderlich "elegant", da ich eine neue Abfrage absetzen muss. Wenn es einfach per Rückgabewert funktionieren würde, wäre das ganze performanter. Wenn ich nur wüßte wie....

                  Comment


                  • #10
                    tsss ... und wer hindert dich daran ELSE zu verwenden?

                    IF NOT EXISTS ...
                    ELSE SELECT 'nix einjefügt'

                    Comment

                    Working...
                    X