2012-03-02 69 views
7

Estoy empezando a conocer a SSIS, me disculpo si la pregunta es demasiado simple.SSIS: ejecuta la primera tarea si se cumple alguna condición salta a la siguiente

que tiene un conjunto de tareas dentro un contenedor foreach-loop-.
La primera tarea sólo tiene que conseguir ejecutado con la condición de que una determinada variable usuario no es nulo o vacío.
De lo contrario, el flujo debe omitir la tarea primera y continuar a la segunda.

¿Cómo voy a hacer para darme cuenta (en detalle) de?

+1

Loon en esta publicación http://stackoverflow.com/questions/2804007/selectively-execute-task-in-ssis-control-flow. Verifique la respuesta de Amos Wood que creo que será la adecuada para usted. – luviktor

+0

@luviktor Tenga en cuenta que cuando la tarea está desactivada no puede habilitarla de nuevo automáticamente. – fancyPants

Respuesta

15

Número 1: Hay dos maneras de interpretar la lógica: "... una cierta variable de usuario no es nulo o vacío":

  1. El (variable no es nulo) o (variable está vacía)
  2. La (variable no es nula) O la (la variable no está vacía).

    Todo se trata del objeto (s?) De la palabra "no". Las diferencias son sutiles pero afectarán cuando se ejecute la primera tarea en el bucle Foreach. Para fines de demostración, supongo que tiene la intención n. ° 1.

    Problema 2: La primera tarea ya no puede ser la primera. Para lograr lo que desea utilizando SSIS dentro del entorno BIDS, debe colocar otra tarea adelante de la tarea anteriormente conocida como "la primera tarea". Esto es para que pueda establecer una Restricción de precedencia en la primera tarea anterior de la nueva primera tarea. Es posible lograr lo que desea diseñando su SSIS dinámicamente desde el código administrado, pero no creo que este problema justifique la sobrecarga asociada con esa opción de diseño. Me gusta usar un Sequence Container vacío como una tarea "Anchor", una tarea que existe únicamente para servir como punto final inicial de una restricción de precedencia. Yo los documenté en gran medida como tal. No quiero que nadie borre el "contenedor vacío innecesario" y deambule por los pasillos durante días sacudiendo la cabeza y repitiendo "Andy, Andy, Andy ...", pero estoy divagando.

    En el ejemplo siguiente, tengo dos restricciones de precedencia que dejan el contenedor de secuencia vacío. Uno va a la tarea que se puede omitir y la otra a la tarea que sigue a la tarea que a veces se puede omitir. Se requiere una tercera restricción de precedencia entre la tarea que a veces se puede omitir y la siguiente tarea. Es importante tener en cuenta que esta tercera restricción de precedencia debe ser editada y la opción de Restricciones Múltiples establecida en O. Esto permite que la tarea siguiente se ejecute cuando se toma cualquiera de las rutas previas mutuamente excluyentes. De forma predeterminada, esto se establece en AND y requerirá ambas rutas para ejecutar. Por definición, eso no - puede no - ocurre con rutas mutuamente excluyentes.

    Compruebo el valor de una variable de cadena SSIS llamada @MyVar para ver si es nula o está vacía. Utilicé la opción de evaluación Expression Only para las restricciones que dejan el contenedor de secuencia vacío. Las expresiones varían pero establecen la exclusividad mutua de la expresión. Mi contenedor de bucles Foreach se ve así:

SSIS diagram

espero que esto ayude.

: {>

0

Eso es un poco complicado.

Debe crear una tarea de secuencia de comandos y comprobar si su variable no es nula allí.

Así que primero tienen la tarea de la escritura en la que va a tener el siguiente código en su función main():

public void Main() 
{ 
    if (Dts.Variables["User::yourVariable"].Value != null) 
    { 
     Dts.TaskResult = (int)ScriptResults.Failure; 
    } 
    else 
    { 
     Dts.TaskResult = (int)ScriptResults.Success; 
    } 
} 

A continuación, se crean dos conexiones desde su tarea de secuencia de comandos, uno para la tarea que necesita se ejecutará cuando su variable no sea nula, y una para la próxima tarea (o para otra secuencia de comandos, si necesita verificar nuevamente, si la variable no es nula).

Luego haga clic con el botón derecho en la flecha (verde) de su primera conexión y seleccione "Fallo". Haga clic con el botón derecho en la conexión a la siguiente tarea/secuencia de comandos y establézcala en "Finalización".

A continuación, debería ser algo como esto:

example

Eso es todo.

0

Espero no haber malinterpretado la pregunta, pero una posible solución puede ser la que se describe a continuación.

Creé una muestra ForEach loop. El bucle en sí es un enumerador de elementos. Enumera los números 1, 2, 3. El valor real se almacena en una variable llamada LoopVariable.

Sample Foreach loop

Settings of the loop

Assigning to variable

Hay otra variable llamada FirstShouldRun que es una variable booleana que muestra la primera tarea en el bucle foreach debe runned o no. Establecí la propiedad EvaluateAsExpression de esta variable en true, y su expresión es (@[User::LoopVariable] % 2) == 0. Me gustaría demostrar con esto que cada dos por tres se debe comenzar la primera tarea.

Variables

Setting of the property of the variable

Las dos tareas no hacen nada mucho pero muestran un cuadro de mensaje que muestra la tarea se ha iniciado.

Inicié el paquete y primero y la tercera vez que la primera tarea no se inició. En el segundo ciclo, apareció MessageBox (que muestra "First started").

Después de eso, debe establecer la variable FirstShouldRun como desee.

Como mencioné en mi primer comentario al OP, esta solución se basa en la idea de Amos Wood escrita en another answer.

1

me gustaría crear un For Loop Container alrededor de la tarea que necesita la condición con las siguientes condiciones (@i es el contador del bucle, @foo es la variable de usuario que desea probar):

  1. InitExpression: @i=0
  2. EvalExpression: @i<1 && !ISNULL(@Foo) && @Foo!=""
  3. AssignExpression : @[email protected]+1
+0

Usar el Loop parece extraño primero, pero creo que esta es la mejor solución porque también funciona para situaciones más complicadas. Y ves que algo importante sucede en este punto (legibilidad). –

2

no hay necesidad de crear un "guión" Creo que la mejor (y más simple) método consiste en añadir una tarea de la escritura en blanco dentro de su contenedor de bucle antes de que su "primera tarea", arrastre la flecha verde de él a su "primera tarea" (que obviamente se convertirá en el segundo) y use la restricción de precedencia para hacer el control.

Para hacer eso, haga doble clic en la flecha, seleccione "expresión" en la "operación de evaluación" y escriba su expresión. Después de presionar OK, la flecha se volverá azul indicando que no es una restricción de precedencia simple, tiene una expresión asignada.

+0

Creo que malinterpretaste la pregunta. Tienes múltiples tareas en uno para el ciclo. Con su enfoque, todo el proceso podría simplemente detenerse. – fancyPants

+0

no, en absoluto. Yo uso este enfoque. Dado que la verificación está dentro del ciclo, se detendrá solo esa interacción y se moverá a la siguiente – Diego

5

¿Qué tal una solución simple en lugar de algunos de los más complejos que ya se han dado. Para la tarea que desea omitir condicionalmente, agregue una expresión a la propiedad deshabilitada. Cualquier expresión que produce un resultado verdadero o falso funcionará, por lo que para el ejemplo de pregunta que podría utilizar:

ISNULL(@[User::MY_VAR]) || @[User::MY_VAR]=="" 

El único inconveniente es que tal vez no tan visibles como algunas de las otras soluciones, pero es mucho más fácil implementar.

+0

Yo recomendaría no establecer propiedades deshabilitadas por expresiones. Parece obvio que la propiedad deshabilitada se evalúa justo antes, pero ocurre al principio del ciclo de vida del paquete (antes de que se ejecute cualquier tarea). Esto puede conducir a problemas de sincronización cuando la variable utilizada en la expresión se establece después de que SSIS ya haya evaluado la propiedad deshabilitada. En el momento en que la ejecución llega al paquete, la expresión puede ser verdadera, pero la tarea NO está desactivada (porque la expresión era anterior y se marcó habilitada). Más información: http://www.sqlis.com/sqlis/post/Disabling-tasks-Through-Expressions.aspx –

7

Lo mejor puede ser utilizar 'Deshabilitar propiedad' en expresiones y dar la expresión según la condición. Simplemente busque cómo usar la propiedad de deshabilitar.

+1

Simple simple simple. Esto merece más votos favorables. – RubberDuck

Cuestiones relacionadas