Si existe: seleccione Evitar que se repita el código

Recibimos una lista de pedidos y validamos que comience con ciertos prefijos, por ejemplo, si OrderNumber no comienza con ABC, entonces se muestra lista de pedidos al usuario como error. Usamos existe, para buscar la primera existencia, no queremos consumir mucho tiempo de rendimiento. Si no existe, entonces podemos comenzar a realizar otra tarea en el código.

¿Hay alguna forma en sql para deshacernos de ella? ¿El código repetitivo? Tenemos muchas verificaciones como esta en varias tablas, tratando de hacer que el código sea más eficiente.

if exists ( select * from dbo.OrdersImport where left(OrderNumber,3) <> "ABC" ) begin select OrderNumber as OrderErrorList from dbo.OrdersImport where left(OrderNumber,3) <> "ABC" end else 

Respuesta

Desafortunadamente, me temo que al tratar de evitar la repetición de código, podría terminar escribiendo más código y haciendo que la consulta sea menos legible. Pero creo que esto puede ser ventajoso para usted: tenga en cuenta situaciones en las que en la prueba solo tendría que buscar en una o dos tablas, donde para recuperar todos los detalles tendrá que unirse a varias más. En esas situaciones, puede simplificar la consulta de prueba, lo que también hace que su ejecución sea más rápida.

Y mientras estamos en eso, también podría considerar cambiar su declaración WHERE. El uso de funciones en el predicado las hace no SARGable y evita el uso de índices en esos casos. Un mejor enfoque en este ejemplo sería verificar

WHERE OrderNumber LIKE "ABC%" 

ya que el optimizador realizará la conversión a algo similar a

OrderNumber >= "ABC" AND OrderNumber < "ABD" 

que admite el uso de índices. Así que esto sería Index Scan (usando left ()) versus Index Seek (usando LIKE).

Respuesta

Desafortunadamente, para una variedad de razones (no solo heredadas) SQL no tiene casi todas las opciones y características de reutilización de código que tienen la mayoría de los lenguajes de cliente y algunas de ellas (como las UDF escalares) tienen problemas importantes. Entonces, en gran medida, si desea ser un programador de SQL efectivo, debe resignarse a hacer mucho más reutilización de código de cortar y pegar de lo que jamás consideraría en un lenguaje de cliente como C #, VB. Net o Java.

Dicho esto, puede eliminar la redundancia en su ejemplo, sin embargo, si realmente es mejor o no, tendrá que decidir.

Declare @OrderErrorList Table(OrderNumber varchar(32)); Insert into @OrderErrorList select OrderNumber as OrderErrorList from dbo.OrdersImport where left(OrderNumber,3) <> "ABC"; if exists ( select * from @OrderErrorList ) begin select * from @OrderErrorList end else 

Comentarios

  • ¿Podría simplificar esto aún más marcando @@ ROWCOUNT en lugar de existe?
  • @mathewb Sí, pero debe hacerse inmediatamente después de INSERT..SELECT. Si agrega otra declaración, de repente deja de funcionar correctamente y trato de evitar minas terrestres como esa en mis respuestas. La solución alternativa sería guardar @@ ROWCOUNT en una variable, pero entonces no sería significativamente mejor que lo que tengo arriba.

Respuesta

¿Existe alguna forma en sql para deshacerse del código repetitivo?

Realmente no, no. Puede reformular la consulta de esta manera, sin la instrucción IF, pero no es realmente diferente de lo que tiene:

SELECT * FROM dbo.OrdersImport o WHERE LEFT(OrderNumber, 3) <> "ABC" AND EXISTS ( SELECT * FROM dbo.OrdersImport WHERE LEFT(OrderNumber,3) <> "ABC" AND ID = o.ID ) 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *