none
SQL-Abfrage mit Schleife

    Frage

  • Hallo,

    Folgendes in einer meiner MS SQL Datenbank Tabelle gibt es 6 Spalten, davon sind aber nur 2 relevant: Datum und ID. Jetzt will ich alte Werte rausgelöscht haben möchte aber nur bis zu einem bestimmten Datum. Ich bin am Kopf zerbrechen wie ich die Schleife am besten programmiere, aber ich bekomm es nicht hin.

    Bei SQL gibt es ja die WHILE Schleife, die Bedingung steht ja hinter dem WHILE und da fängt es bei mir schon an.

    Mein Ansatz wäre

    WHILE (SELECT Datum FROM Tabellenname where '20-08-2017')

    BEGIN

    DELETE ID FROM tabellenname where '4'

    END

    Wenn ich es richtig verstanden habe, ist das was in den Klammern steht das Abbruch Kriterium?

    Wäre es das so korrekt?


    • Bearbeitet Syconn Samstag, 13. Januar 2018 18:24
    Samstag, 13. Januar 2018 18:24

Antworten

Alle Antworten

  • Hi,

    vergiss im Zusammenhang mit SQL Abfragen Schleifen erstmal komplett.

    Für den Fall (und die allermeisten anderen Sachen) brauchst Du keine Schleife.

    DELETE
    FROM   <Tabelle>
    WHERE  <Spalte> = '20-08-2017'

    Beachte aber, dass damit die Zeilen komplett gelöscht werden, bei denen der Wert in der angegebenen Spalte der Bedingung entspricht. Es werden also nicht die Werte in der Zeile geleert, sondern eben die ganze Zeile gelöscht.

    Falls Du die Zeilen behalten aber die Werte in den irrelevanten Spalten leeren willst, geht das bspw. so:

    UPDATE <Tabelle>
    SET    <Spalte1> ) = NULL,
           <Spalte2> ) = NULL,
           ...
    WHERE  <SpalteX> = '20-08-2017'
    Zudem solltest Du, wenn die Spalte in der WHERE Klausel vom Typ date ist, den Abfragewert im Format 'YYYYMMDD', also bspw. '20170820' schreiben.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 13. Januar 2018 18:50
    Moderator
  • Ich möchte alle Zeilen bis zum Datum xxxxxxxx löschen. Wenn ich das mache wie du das geschrieben hast, dann löscht er mir ja nur die Zeile mit dem Datum "20170820" richtig?

    Darum ja ne Schleife, dass er Zeile für Zeile durch geht und checkt ob er an dem Datum angelangt ist.

    Samstag, 13. Januar 2018 22:31
  • Am 13.01.2018 schrieb Syconn:

    Ich möchte alle Zeilen bis zum Datum xxxxxxxx löschen. Wenn ich das mache wie du das geschrieben hast, dann löscht er mir ja nur die Zeile mit dem Datum "20170820" richtig?

    Dann eben mit einem kleiner Zeichen probieren:

    DELETE
    FROM     <Tabelle>
    WHERE    <Spalte> < '20-08-2017'

    Zur Sicherheit vorher einfach per SELECT prüfen, ob es die richtigen Datensätze betrifft.

    SELECT *
    FROM     <Tabelle>
    WHERE    <Spalte> < '20-08-2017'

    Syntax Beispiele: https://technet.microsoft.com/de-de/library/ms174464(v=sql.110).aspx
    https://msdn.microsoft.com/de-de/library/ms181567(v=sql.120).aspx

    Servus
    Winfried


    WSUS Package Publisher: http://wsuspackagepublisher.codeplex.com/
    HowTos zum WSUS Package Publisher http://www.wsus.de/wpp
    GPO's: http://www.gruppenrichtlinien.de
    NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/

    Samstag, 13. Januar 2018 22:54
  • Bis zum Datum "<", einschließlich Datum "<=".
    Sonntag, 14. Januar 2018 13:09
  • Vielen Dank für eure Antworten und haben mir jetzt schon viel weitergeholfen :)


    Allerdings hab ich bei der Spalte  "Datum" als Datentyp "datetime" mit dem Format "yyyy-dd-mm hh:mm:ss.mmm".

    Wenn ich folgendes Versuche

    SELECT *
    FROM     tabelle1
    WHERE    [Datum] >= '2017-05-16 12:15:52.000' AND [ID] = 10;

    Bringt er mir die Fehlermeldung "Bei der Konvertierung eines varchar-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs."

    Wenn ich die ' ' weg lasse, sagt er mir "Falsche Syntax in der Nähe von "12". "

    Wenn ich nur das Datum z.B. 20-08-2017 dran steht habe, meckert er nicht, aber er gibt mir keine Zeilen aus.

    Mein Ansatz wäre gewesen:

    DECLARE @STRING1 as varchar(30);
    SET @STRING1 = '2017-05-16 12:15:52.000';

    SELECT *
    FROM     tabelle1
    WHERE    [Datum] >= @STRING1 AND [ID] = 10;

    Aber das geht auch nicht...

    Wie mache ich das jetzt?


    Sonntag, 14. Januar 2018 15:10
  • Für die Abfrage muss das Datum entweder in der Spracheinstellung oder im ISO-Format als Text eingegeben werden. Wobei ISO die einfachere Wahl ist:

    YYYY-MM-DDTHH:MM:SS.MMM

    Also

    '2017-05-16T12:15:52.000'

    oder auch

    '2017-05-16T12:15:52'

    Weiteres siehe hier:
    https://docs.microsoft.com/de-de/sql/t-sql/data-types/datetime-transact-sql#supported-string-literal-formats-for-datetime

    Sonntag, 14. Januar 2018 16:24
  • Hat funktioniert vielen Dank!!!

    SELECT *
    FROM     Tabellenname
    WHERE    [Datetime] <= '2017-05-16T12:15:52.000;

    Sowohl auch

    DELETE
    FROM     Tabellenname
    WHERE    [Datetime] <= '2017-05-16T12:15:52.000';

    Sonntag, 14. Januar 2018 17:07