Los parámetros solo funcionan en conjunto con otros, pero quiero que f

Los parámetros solo funcionan en conjunto con otros, pero quiero que funcionen de forma independiente

Tengo el siguiente script:

DECLARE @PlanId NVARCHAR(255) = ''
DECLARE @PlanName NVARCHAR(255) = ''
DECLARE @ActionID NVARCHAR(255) = ''
DECLARE @ActionDescription01 NVARCHAR(255) = ''
DECLARE @ActionDescription02 NVARCHAR(255) = ''
DECLARE @ActionDescription03 NVARCHAR(255) = ''
DECLARE @ActionDescription04 NVARCHAR(255) = ''
DECLARE @ActionDescription05 NVARCHAR(255) = ''

select ap.plan_id ,ap.plan_name ,apa.action_id ,apa.action_description
from dbo.ACTION_PLAN ap
LEFT JOIN ACTION_PLAN_LINK AS apl ON apl.PLAN_ID = ap.PLAN_ID 
LEFT JOIN dbo.ACTION_PLAN_ACTION AS apa ON apa.ACTION_ID = apl.ACTION_ID
WHERE
    (ap.PLAN_ID = @PlanId or @PlanId = '')
and (ap.PLAN_NAME = @PlanName or @PlanName = '')
and (apa.ACTION_ID = @ActionID or @ActionID = '')
and ( 
      ( (len(@ActionDescription01)>1 and apa.ACTION_DESCRIPTION like ('%' + @ActionDescription01+ '%') ) )
   or ( (len(@ActionDescription02)>1 and apa.ACTION_DESCRIPTION like ('%' + @ActionDescription02+ '%') ) )
   or ( (len(@ActionDescription03)>1 and apa.ACTION_DESCRIPTION like ('%' + @ActionDescription03+ '%') ) )
   or ( (len(@ActionDescription04)>1 and apa.ACTION_DESCRIPTION like ('%' + @ActionDescription04+ '%') ) )
   or ( (len(@ActionDescription05)>1 and apa.ACTION_DESCRIPTION like ('%' + @ActionDescription05+ '%') ) )
    )

La secuencia de comandos anterior funciona bien cuando se busca usando descripciones de acciones, pero no me permite buscar solo un plan_id, plan_name o action_id. Me gustaría poder buscar cualquiera o una combinación de los parámetros. También me gustaría agregar la razón por la que usé el operador o en la descripción de la acción donde la cláusula trae más resultados para cada acción buscada. Por ejemplo, busco plan_id 100, luego ingreso 'inform' en actiondescription01 y obtengo un resultado, luego ingreso 'order' en el parámetro actiondescription02 y obtengo 3 resultados ya que hay dos relacionados con order y uno pertenecientes a informar pero todos son parte de un plan_id (si se ingresa un plan_id).

Espero que esto tenga sentido y que alguien pueda ayudar. El script anterior funciona exactamente como quiero, pero por alguna razón no puedo buscar un PlanId, PlanName o ActionId de forma independiente, pero funcionan si busco junto con un parámetro de descripción de acción.

Mostrar la mejor respuesta

Lea esto para obtener algunos consejos sobre cómo mejorar su pregunta.

Creo que tienes que cambiar estas líneas

or ( (len(@ActionDescription02)>1 and apa.ACTION_DESCRIPTION like ('%' + @ActionDescription02+ '%') ) )

A algo como esto

or (
    len(@ActionDescription02)=0 
    or ( len(@ActionDescription02)>0 
         and apa.ACTION_DESCRIPTION like '%' + @ActionDescription02+ '%' )
   )

gracias por su respuesta, pero esto no funciona como si solo completara un parámetro, los criterios para len (actiondescription02) = 0 siempre se cumplen.

@msinghm No, debe repetir esta construcción para cualquier parámetro. Debe verificar que el parámetro no esté configurado O esté configurado Y cumpla una condición.

No puedo usar el operador AND porque quiero poder buscar en varias descripciones de acción (hasta, pero no siempre, las 5) aumentando el conjunto de datos resultante cada vez. En mi ejemplo anterior usando informar y ordenar, las acciones que incluyen esas palabras están en filas diferentes pero pertenecen al mismo plan. El uso de AND arrojaría resultados que cumplen ambos criterios.

Tienes más ( ) de las que necesitas
El and ( ( lo está matando. Si ninguno o el or en ese grupo son verdaderos, entonces ese and es falso.

select ap.plan_id ,ap.plan_name ,apa.action_id,  apa.action_description
from dbo.ACTION_PLAN ap
LEFT JOIN ACTION_PLAN_LINK AS apl       ON apl.PLAN_ID   = ap.PLAN_ID 
LEFT JOIN dbo.ACTION_PLAN_ACTION AS apa ON apa.ACTION_ID = apl.ACTION_ID
WHERE (ap.PLAN_ID    = @PlanId   or @PlanId = '')
  and (ap.PLAN_NAME  = @PlanName or @PlanName = '')
  and (apa.ACTION_ID = @ActionID or @ActionID = '')
  and (    ( len(@ActionDescription01) > 1 and apa.ACTION_DESCRIPTION like '%' + @ActionDescription01 + '%' ) 
        or ( len(@ActionDescription02) > 1 and apa.ACTION_DESCRIPTION like '%' + @ActionDescription02 + '%' ) 
        or ( len(@ActionDescription03) > 1 and apa.ACTION_DESCRIPTION like '%' + @ActionDescription03 + '%' ) 
        or ( len(@ActionDescription04) > 1 and apa.ACTION_DESCRIPTION like '%' + @ActionDescription04 + '%' ) 
        or ( len(@ActionDescription05) > 1 and apa.ACTION_DESCRIPTION like '%' + @ActionDescription05 + '%') ) 
      )

arreglar

and (      ( len(@ActionDescription01) = 0 and len(@ActionDescription02) = 0 ...)
        or ( len(@ActionDescription01) > 1 and apa.ACTION_DESCRIPTION like '%' + @ActionDescription01 + '%' ) 
        or ( len(@ActionDescription02) > 1 and apa.ACTION_DESCRIPTION like '%' + @ActionDescription02 + '%' ) 
        or ( len(@ActionDescription03) > 1 and apa.ACTION_DESCRIPTION like '%' + @ActionDescription03 + '%' ) 
        or ( len(@ActionDescription04) > 1 and apa.ACTION_DESCRIPTION like '%' + @ActionDescription04 + '%' ) 
        or ( len(@ActionDescription05) > 1 and apa.ACTION_DESCRIPTION like '%' + @ActionDescription05 + '%') ) 
      )