Announcement

Collapse
No announcement yet.

Delete-Befehl

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

  • Delete-Befehl

    Hallo,

    ich habe eine DB-Tabelle und ein Textfile (welches die richtigen Tabelleneinträge beinhaltet). Ich möchte nun mit Hilfe eines Programmes überprüfen ob in der DB-Tabelle ein Tupel zu viel drin ist, als in der Textfile. Alle Tupel die in der Textfile und in der DB-Tabelle enthalten sind werden vorher herausgefiltert, dabei wird ein Update-String gebaut und an die DB gesendet. Kann man nun diesen Update Befehl ein Delete from <tabelle> vorranstellen um alle zu löschen, die nicht geupdatet werden?

    <<<Auszug aus dem Befehl>>>
    Delete from <tabelle> WHERE NOT (UPDATE <tabelle> SET <Spalten> = Wert, ... WHERE <ID-Spalte> = Wert)

    <--- dieser Befehl (mit richtigen Werten )klappt nicht so richtig. Da das Programm nicht von mir ist, muss ich mich auch erstmal hier reinfitzen, aber meine Frage. Ist die Logik erstmal prinzipiell richtig? Kann man so die überflüssigen Tupel löschen?

    Viele Grüße

  • #2
    So wird es auch nicht gehen. da der update befehl ja nichts zurückgibt.
    Du willst ja alle Löschen, welche nicht in der Textdatei stehen

    delete from <tabelle> where <ID-Spalte> not in ( ...)

    Man könnte die Tabelle um einen Timestamp/Datumswert ergänzen und dann alle Löschen, welche nach dem Update noch ein älteres datum besitzen.

    Comment


    • #3
      Okay, Danke schonmal ich weiß jetzt schonmal das es so nicht geht

      Mh mit den Timestamp ist eine gute Idee, aber wohl nicht realisierbar...
      Muss ich mir mal überlegen wie ich den Befehlsstring neu zusammen baue.

      Comment


      • #4
        Hallo,

        So wird es auch nicht gehen. da der update befehl ja nichts zurückgibt...
        Wenn der MS SQL Server 2005 verwendet wird, liefert UPDATE auf Wunsch die Menge der aktualisierten Datensätze zurück. Über die neue OUTPUT-Anweisung stellt der SQL Server 2005 die von einer INSERT-, UPDATE- oder DELETE-Anweisung betroffenen Datensätze letztmalig als virtuelle Ergebnismenge bereit, indem für diese DML-Operationen analog zu einem Trigger die virtuellen Tabellen INSERTED und DELETED eingeblendet werden. Das folgende Beispiel protokolliert bei einer UPDATE-Anweisung die vorherigen Feldwerte in einer Log-Tabelle mit, in dem über DELETED.wert und INSERTED.wert der alte und neue Wert ausgelesen wird:

        Code:
        CREATE TABLE OutputDemo(
          id    INT         NOT NULL IDENTITY PRIMARY KEY,
          wert  NVARCHAR(9) NOT NULL)
        GO
        INSERT INTO OutputDemo (wert) VALUES ('Alt');
        GO
        
        CREATE TABLE OutputDemoLog(
          historie  NVARCHAR(MAX) NOT NULL)
        GO
        
        UPDATE OutputDemo
          SET wert = 'Neu' 
          OUTPUT 'ID: ' + CAST(DELETED.id AS NVARCHAR) +  
            '; Vorher: ''' + DELETED.wert + 
            '''; Nachher: ''' + 
          INSERTED.wert + '''' INTO OutputDemoLog
        WHERE id = 1;

        Comment

        Working...
        X