Benutzer mit den meisten Antworten
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
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- Als Antwort vorgeschlagen Stefan FalzModerator Sonntag, 14. Januar 2018 05:49
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 25. Januar 2018 10:10
-
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).aspxServus
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/- Als Antwort vorgeschlagen Stefan FalzModerator Sonntag, 14. Januar 2018 05:49
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 25. Januar 2018 10: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- Als Antwort vorgeschlagen Der Suchende Sonntag, 14. Januar 2018 17:58
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 25. Januar 2018 10:10
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- Als Antwort vorgeschlagen Stefan FalzModerator Sonntag, 14. Januar 2018 05:49
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 25. Januar 2018 10:10
-
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.
-
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).aspxServus
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/- Als Antwort vorgeschlagen Stefan FalzModerator Sonntag, 14. Januar 2018 05:49
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 25. Januar 2018 10:10
-
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?
-
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- Als Antwort vorgeschlagen Der Suchende Sonntag, 14. Januar 2018 17:58
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 25. Januar 2018 10:10