Ich versuche, eine Abfrage so einzurichten, dass zwei Daten aus zwei verschiedenen Tabellen verglichen werden. Wenn sie gleich sind, wird die Abfrage beendet. Wenn sie nicht gleich sind, wird die Abfrage fortgesetzt und einige Elemente eingefügt. Ich kann jedoch nicht herausfinden, wie ich es dazu bringen kann, das zu tun, was ich will.
SELECT TOP(1) @dateA=a.someDate
FROM a
ORDER BY DESC;
SELECT TOP(1) @dateB=b.someDate
FROM b
ORDER BY DESC;
CASE WHEN @dateA=@dateB THEN raiseerror('dates equal',20,-1) with log;
Insert statements;
Jede Hilfe wäre super dankbar.
sql-server
t-sql
thejoker34
quelle
quelle
CASE
- SQL Server hat nur denCASE
Ausdruck.Antworten:
CASE
ist ein Ausdruck (keine Anweisung) und kann nicht für eine solche Flusskontrolle verwendet werden - keine Befehle aufrufen, nicht mehr als eine Spalte / einen Wert zurückgeben, nicht als eigenständiger Befehl verwendet werden.Mir scheint, Sie können
IF
den Fehler nur verwenden , wenn die Daten gleich sind, andernfalls führen Sie die Einfügungen aus.Sie können es auch anders machen. Führen Sie die Einfügungen nur aus, wenn die Daten nicht gleich sind. Andernfalls wird der Fehler ausgelöst:
Wenn Sie den Fehler zu verwenden , dachte nur für den Zweck des Erhaltens aus der Einsätze läuft, dann können Sie einfach alles aus entfernen
ELSE
unten, da der einzige Weg , laufen die Einsätze, wenn@dateA
und@dateB
sind nicht gleich :Ich bin weit zurückgegangen, weil ich in Bezug auf Zeilen (vs. "Datensätze") und Spalten (vs. "Felder") pedantisch war, aber genau aus diesem Grund ist der gesamte Ausdruck vs. Aussage eine sehr wichtige Unterscheidung. Siehe " Schmutzige Geheimnisse des CASE-Ausdrucks ".
quelle
NULL
. Es ist immer noch eine gute Beobachtung, dass die beiden Versionen, die Aaron zur Verfügung stellt, in diesem Fall unterschiedliche Dinge tun werden.Verwenden Sie ein
IF
anstelle von aCASE
Dies setzt natürlich voraus, dass Sie tatsächlich einen Fehler auslösen möchten. Die andere Option wäre:
Beachten Sie nun das
BEGIN
und dasEND
. Die werden wichtig sein. DieIF
Anweisung (und dieELSE
) wirken sich nur auf den Befehl direkt darunter aus. Wenn Sie mehr als einen Befehl benötigen, benötigen Sie einen BEGIN und einen END .quelle
Andere Antworten haben darauf hingewiesen, dass CASE ein Ausdruck und keine Aussage ist und daher selbst keine Aussagen (wie
RAISEERROR
oder andere) umfassen kann. Wenn es nicht viele Bedingungen gibt - insbesondere wenn es sich nur um eine Bedingung handelt -, ist die IF-Anweisung die perfekte Wahl für das, was Sie versuchen, wie bereits erwähnt.Abhängig von Ihrem Szenario kann dennoch ein CASE-Ausdruck verwendet werden, nur nicht genau so, wie Sie es gezeigt haben. Insbesondere wenn viele Bedingungen überprüft werden müssen, unter denen eine Übereinstimmung zu denselben Aktionen führen sollte (z. B. Auslösen einer Ausnahme und Beenden des Skripts), können Sie einen CASE-Ausdruck in einer Zuweisungsanweisung verwenden, in der das CASE-Ergebnis gespeichert ist, und dann folgen es mit einer IF, die das gespeicherte Ergebnis überprüft und gegebenenfalls die erforderlichen Aktionen ausführt, wie folgt:
In diesem Fall löst die erforderliche Aktion eine Ausnahme aus, aber die mit der Ausnahme zurückgegebene Nachricht muss davon abhängen, welche Bedingung zuerst überprüft wurde. Die Zuweisungsanweisung verwendet einen CASE-Ausdruck, um auszuwählen, welche Nachricht in der
@ErrorMessage
Variablen gespeichert werden soll.Sie können auch sehen, dass der Fehler nur bedingt ausgelöst wird - nur wenn die Variable tatsächlich eine anzuzeigende Nachricht enthält. Wenn der Wert eine leere Zeichenfolge oder eine Null ist, wird das Skript ohne Unterbrechung fortgesetzt.
quelle
Benötigen Sie die Variablen?
quelle