Estoy tratando de configurar una consulta, para que compare dos fechas de dos tablas diferentes, y si son iguales, entonces la consulta se cierra. Si no son iguales, la consulta continuará e insertará algunas cosas. Sin embargo, no puedo entender cómo hacer que haga lo que quiero.
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;
Cualquier ayuda sería muy apreciada.
sql-server
t-sql
thejoker34
fuente
fuente
CASE
: SQL Server solo tiene laCASE
expresión.Respuestas:
CASE
es una expresión (no una declaración) y no se puede usar para un control de flujo como ese, no para llamar a comandos, no para devolver más de una columna / valor, no para ser usado como un comando por sí solo.Me parece que solo puede usar
IF
para aumentar el error cuando las fechas son iguales, de lo contrario, ejecute las inserciones.También puedes hacerlo de otra manera. Ejecute las inserciones solo si las fechas no son iguales , de lo contrario, genere el error:
Si pensó utilizar el error solo con el fin de dejar de ejecutar las inserciones, puede eliminar todo de
ELSE
abajo, ya que la única forma en que se ejecutarán las inserciones es cuándo@dateA
y no@dateB
son iguales :He retrocedido mucho para ser pedante sobre cosas como filas (vs. "registros") y columnas (vs. "campos"), pero la expresión completa vs. declaración es una distinción muy importante, exactamente por esta razón. Ver " Secretos sucios de la expresión CASE ".
fuente
NULL
. Todavía es una buena observación que las dos versiones que ofrece Aaron harán cosas diferentes en ese caso.Use un en
IF
lugar de unCASE
Por supuesto, esto supone que realmente desea generar un error. La otra opción sería:
Ahora, tenga en cuenta el
BEGIN
y elEND
. Esos serán importantes. laIF
declaración (y laELSE
) solo afecta el comando justo debajo de ella. Si necesita más de un comando, necesita un COMIENZO y un FIN .fuente
Otras respuestas han señalado que CASE es una expresión , no una declaración, y por lo tanto no puede abarcar declaraciones (como
RAISEERROR
o cualquier otra). Si las condiciones no son muchas, particularmente cuando es solo una condición, la declaración IF es la elección perfecta para lo que está tratando de hacer, como también se ha mencionado.Sin embargo, dependiendo de su escenario, una expresión CASE aún podría usarse, pero no exactamente de la manera que ha mostrado. En particular, si hay muchas condiciones para verificar donde una coincidencia debe dar como resultado el mismo conjunto de acciones (por ejemplo, generar una excepción y finalizar el script), puede usar una expresión CASE en una declaración de asignación que almacene el resultado de CASE, luego siga con un IF que verifica el resultado almacenado y realiza las acciones requeridas, si corresponde, de esta manera:
En este caso, la acción necesaria genera una excepción, pero el mensaje devuelto con la excepción debe depender de qué condición se verificó primero. La instrucción de asignación usa una expresión CASE para elegir qué mensaje almacenar en la
@ErrorMessage
variable.También puede ver que el error se genera solo condicionalmente, solo si la variable realmente contiene un mensaje para mostrar. Si el valor es una cadena vacía o nula, el script simplemente continuará sin interrupción.
fuente
¿Necesitas las variables?
fuente