4 Stimmen

SQL - wie prüft man eine Tabelle auf neue Daten?

Ich muss eine gespeicherte Prozedur erstellen, die bei der Ausführung prüft, ob innerhalb der letzten 12 Stunden neue Zeilen zu einer Tabelle hinzugefügt wurden. Wenn nicht, muss eine Warn-E-Mail an einen Empfänger gesendet werden.

Ich habe die Verfahren zum Senden der E-Mail, aber das Problem ist die Abfrage selbst. Ich könnte mir vorstellen, dass ich einen SQL-Befehl erstellen muss, der das aktuelle Datum verwendet und es mit den Daten in den Zeilen vergleicht. Aber ich bin ein absoluter Anfänger in SQL, so dass ich nicht einmal die richtigen Wörter verwenden kann, um etwas auf Google zu finden.

Kurzfassung:

Wie kann ich mit MS SQL Server 2005 die Daten überprüfen und dann ein Ergebnis zurückgeben, das darauf basiert, ob in den letzten 12 Stunden neue Zeilen erstellt wurden, und dieses Ergebnis verwenden, um zu entscheiden, ob eine E-Mail gesendet werden soll oder nicht?

6voto

John Sansom Punkte 40295

So etwas sollte das tun, was Sie wünschen.

Select ID
from TableName
where CreatedDate >= dateadd(hour,-12,getDate())

Ich hoffe, das ist klar, aber Sie können gerne weitere Fragen stellen.

Prost, John

5voto

Frans Bouma Punkte 8141

Angenommen, Ihr Datumsfeld in der Tabelle heißt "CreateDate" und ist vom Typ DateTime. Die Zeit, mit der Sie vergleichen müssen, ist: GETDATE() (das Datum + Zeit zurückgibt) Um den Datumswert von 12 Stunden davor zu erhalten, wird DATEADD verwendet: DATEADD(Stunde, -12, GETDATE())

Wenn wir also die Anzahl der in den letzten 12 Stunden hinzugefügten Zeilen wissen wollen, reicht das:

SELECT COUNT(*)
FROM Table
WHERE CreateDate >= DATEADD(hour, -12, GETDATE())

in Ihrem Proc müssen Sie das Ergebnis dieser Abfrage in einer Variablen speichern und prüfen, ob es > 0 ist, also:

DECLARE @amount int
SELECT @amount=COUNT(*)
FROM Table
WHERE CreateDate >= DATEADD(hour, -12, GETDATE())

und prüfen Sie dann die Variable @amount, wenn sie > 0 ist.

0voto

HadleyHope Punkte 1173

Sie könnten einen Auslöser verwenden, dieser Link enthält mehrere Beispiele: http://msdn.microsoft.com/en-us/library/aa258254(SQL.80).aspx

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'reminder' AND type = 'TR')
   DROP TRIGGER reminder
GO

CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE, DELETE 
AS
   EXEC master..xp_sendmail 'MaryM', 
      'Don''t forget to print a report for the distributors.'
GO

Wenn Sie nicht für jede Einfügung/Aktualisierung etwas haben wollen, könnten Sie die Daten in eine andere Tabelle kopieren und diese Tabelle dann alle 12 Stunden untersuchen, über die Zeilen darin berichten und sie dann löschen...

0voto

chburd Punkte 4091

Angenommen, Sie haben auf diesem Tisch : - entweder eine eindeutige ID mit Autoinkrementierung - entweder ein Feld created_timestamp, das den Zeitstempel der Erstellung der Zeile enthält

-> haben eine neue Tabelle

reported_rows
  - report_timestamp
  - last_id_seen
 (OR)
  - last_timestamp_seen

Füllen Sie die gemeldete Zeile jedes Mal, wenn Sie Ihre E-Mail senden, mit dem aktuellen Wert und vor dem Versenden der E-Mail mit den vorherigen Werten abgleichen, damit Sie wissen, welche Zeilen hinzugefügt wurden

0voto

Joe Punkte 39875

Wenn die Tabelle ein Identitätsfeld hat, können Sie auch den Maximalwert (als Lesezeichen) speichern und beim nächsten Mal prüfen, ob es Zeilen mit einer ID gibt, die größer ist als Ihr gespeichertes Lesezeichen. Dies kann schneller sein, wenn der Schlüssel ein Clusterschlüssel ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X