Explicación de consulta de SQL Server

Estoy trabajando en el código de una persona que ocupó mi puesto hace más de 2 años y tengo problemas para descifrar un bloque de su código SQL.

WHERE  ACCOUNT NOT IN (SELECT ACCOUNT
                   FROM   MWAPPTS A1
                   WHERE  A1.ACCOUNT = A.ACCOUNT
                          AND ADATE > dbo.Endofmonth(ACTIONDATE)
                          AND REASON IN ('CPE','NPPE')
                          AND USERFLAG IN ( 'U', 'B' ))

dbo.Endofmonth es un procedimiento almacenado que obtiene el último día del mes para la fecha ingresada.

Si estoy leyendo bien, no estamos incluyendo las filas en las que la declaración de selección que se muestra devolvería la cuenta. Sin embargo, tengo problemas con la declaración de selección. ¿Estoy en lo cierto en que se está poniendo ACCOUNT sin que importe ADATE es mayor que el final del mes. El motivo ES "CPE" o "NPPE", y el USERFLAG es "U" o "B"?

preguntado el 27 de julio de 12 a las 20:07

Si bien una función de fin de mes es útil, es mejor usar fechas de estilo exclusivas de límite inferior inclusivo y límite superior, es decir, usar aDate >= dbo.StartOfMonth(actionDate); esto también facilitaría la comparación con las marcas de tiempo y similares. También tengo bastante curiosidad sobre el resto de la declaración, ya que no puedo quitarme la sensación de que hay posibles optimizaciones disponibles. Oh, no agregue sufijos a los nombres de las columnas con tipos de datos, asígnele un nombre para que su tipo sea obvio, digamos, actionOccurredOn o similar (soy consciente de que probablemente no pueda cambiar la base de datos). -

@X-Zero Ojalá pudiera publicar todo el SP para que pudiera ver lo terrible que es, pero desafortunadamente es de naturaleza medial y, por lo tanto, está protegido por HIPPA. Todo el código que heredé es tan malo que iría tan lejos como para llamarlo ridículo. -

No soy un asesor legal/abogado, pero no pensé código fuente estaba cubierto. Obviamente datos es, y en realidad no debería compartirse (aunque potencialmente podría anonimizarse primero). -

2 Respuestas

Sí, está devolviendo los registros donde la cuenta no tiene lo siguiente:

1) un ADATE mayor que la fecha devuelta por la función dbo.Endofmonth(ACTIONDATE).

2) a Reason que sea CPE or NPPE

3) y el Userflag es cualquiera U or B.

Tendrías que mirar el código en la función. dbo.Endofmonth(ACTIONDATE) para determinar exactamente lo que está devolviendo.

Respondido 27 Jul 12, 21:07

¿Tengo razón en que está obteniendo una CUENTA donde ADATE es anterior al final del mes?

El interior SELECT mismo está buscando entradas donde ADATE is después de fin de mes de ACTIONDATE. NOT IN en el exterior SELECTluego debe recuperar filas donde la cuenta ADATE is <= fin de mes de ACTIONDATE.

Tus otras suposiciones parecen correctas.

Aparte: parece dbo.Endofmonth es una función definida por el usuario, no un procedimiento almacenado (o no sería posible llamarlo así).

Respondido 27 Jul 12, 21:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.