Error de tarea del sistema de archivos SSIS: el tipo de valor que se asigna a la variable... difiere del tipo de variable actual

Bien... Tengo un paquete SSIS relativamente simple (DTSDesigner100, Visual Studio 2008 Versión 9.0.30729.4462 QFE, .NET Framework 3.5 SP1). Al final del flujo de control SSIS para el paquete hay un Tarea del sistema de archivos el cual es un Cambiar nombre del archivo operación.

Las propiedades de esta tarea del sistema de archivos son las siguientes:

  • EsDetinationPathVariable: Verdadero
  • Variable de destino: Usuario::Nombre del archivo de salida
  • Sobrescribir Destino: Verdadero
  • Descripción: Tarea del sistema de archivos
  • Operación: Renombrar archivo
  • IsSourcePathVariable: Falso
  • Conexión de origen: destino de copia de plantilla de Excel

No hay expresiones definidas. Como puede ver, tengo el destino asignado como una variable User::OutputFileName. Así que veamos esa variable...

  • Nombre: Nombre del archivo de salida
  • Alcance: Paquete
  • Tipo de datos (ValueType): Cadena
  • Valor:
  • Espacio de nombres: Usuario
  • Evaluar como expresión: verdadero
  • Solo lectura: falso
  • Expresión: (ver más abajo)

.

"\\\\SERVER\\Folder\\" + "MyAwesomeExcelWorkbook_"
+ (DT_WSTR,4)DATEPART("year", GETDATE())+ "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("mm", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("dd", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("hh", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("mi", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("ss", GETDATE()), 2)
+ ".xlsx"

Entonces puedo evaluar esta expresión con éxito. Cada vez que el paquete se ejecuta (y falla), su valor es el valor de la expresión evaluada, como cabría esperar.

Cuando ejecuto el paquete, esto es lo que sucede...

  1. Los pasos anteriores se ejecutan correctamente.
  2. Se inicia la tarea del sistema de archivos y se cambia el nombre del archivo correctamente.
  3. Sin embargo, el paquete ahora falla ya que la tarea del sistema de archivos falla con el siguiente error:

.

Error: 0xC001F009 at Package: The type of the value being assigned to variable "User::OutputFileName" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.
Task failed: Rename Excel Workbook
Error: 0xC0019001 at Rename Excel Workbook: The wrapper was unable to set the value of the variable specified in the ExecutionValueVariable property.
Warning: 0x80019002 at Package: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED.  The Execution method succeeded, but the number of errors raised (4) reached the maximum allowed (1); resulting in failure. This occurs when the number of errors reaches the number specified in MaximumErrorCount. Change the MaximumErrorCount or fix the errors.
SSIS package "Package.dtsx" finished: Failure.

Aparentemente hay algún detalle menor que estoy olvidando aquí. Ahora, he intentado convertir la expresión completa como DT_WSTR,512, que se evalúa bien, pero la tarea del sistema de archivos seguirá fallando con el mismo error.

¿Alguien que pueda señalar los detalles que estoy pasando por alto? Gracias por adelantado.

preguntado el 03 de mayo de 12 a las 19:05

6 Respuestas

También encontré el mismo error. Estaba usando una "Ejecutar tarea de SQL" para ejecutar un procedimiento almacenado, desde el cual los valores del conjunto de resultados de una sola fila se usaban para establecer las variables del paquete SSIS. Las variables del procedimiento almacenado se declararon como "varchar (max)" y las asigné a variables de nivel de paquete que se definieron como "cadena".

Así que intenté cambiar las declaraciones del procedimiento almacenado a varchar (512) y "VOILA"... no más errores. En realidad... también funcionó con varchar(8000) y nvarchar(4000)... pero SSIS no likey varchar(max).

Respondido 17 Jul 14, 19:07

Me salvas. No sé por qué SSIS no admite varchar (max), pero admite 8000 y menos. - Heinz Siahaan

El problema es que la variable está en el ámbito del Paquete, y no de la tarea.
El cambio de la variable para que se ajuste al ámbito de la tarea da como resultado una ejecución exitosa.

EDIT: Pensé que tenía que preguntar: ¿por qué? Honestamente, esto no concuerda con mi comprensión de SSIS, que he usado desde su introducción a través de cada CTP de Denali. Lo que está sucediendo debajo del capó que hace que esto sea perfecto para las variables del ámbito de la tarea, pero no para las del ámbito del paquete que se utilizan en una tarea del sistema de archivos? Fuera de ciertas tareas no hay problema, pero hay uno cuando los uso en ciertas tareas. ¿Que esta pasando?

contestado el 04 de mayo de 12 a las 03:05

Esto no tiene ningún sentido. Necesito una variable para ser utilizada en dos tareas diferentes. De todos modos, gracias por tu respuesta. Me había ayudado a encontrar una solución diferente. - Celerno

Es posible que desee verificar las variables "adicionales" en su paquete SSIS. Las variables del ámbito del paquete deben estar disponibles en la tarea. Abra la ventana Variables y haga clic en la ventana "Mostrar todas las variables" para ver si tiene dos variables, en diferentes ámbitos, denominadas OutputFileName.

Mostrar todas las variables

Dado que las variables se identifican por nombre en SSIS, una variable en un ámbito más bajo, por ejemplo, un contenedor de secuencia que contiene la tarea del sistema de archivos, efectivamente interceptar la identificación de variable de una variable con ámbito de paquete si ambas variables tienen el mismo nombre:

Múltiples variables del mismo nombre

Espero que esto ayude, Andy

contestado el 03 de mayo de 12 a las 20:05

No es el caso en esta situación. - El DBA perezoso

Me gustaría agregar algo de información, siendo esta la descripción más cercana a mi problema actual y espero que ayude a alguien más. Estoy cargando un objeto de conjunto de registros de una tarea de SQL parametrizada, luego, posteriormente, uso un bucle for each en el conjunto de registros y cargo los campos en variables.

Recibí el error anterior en una de las variables que estaba cargando en for each loop.

El problema desapareció cuando modifiqué el antes Tarea SQL que completa el conjunto de registros.

es decir, cuando se usó esto en la tarea SQL anterior, se produjo un error al cargar COL2 en una variable en un ciclo posterior para cada ciclo:

SELECT COL1, COL2 FROM Table WHERE COL2 = ? OR ? = ''

(o)

SELECT COL1, COL2 FROM Table WHERE COL2 = ? OR ? = N''

y esto detuvo el error que ocurre:

SELECT COL1, COL2 FROM Table WHERE COL2 = ?

La funcionalidad de los parámetros es decepcionante en SSIS.

  • No se pueden poner parámetros en la parte seleccionada
  • No se puede envolver una función de conversión alrededor de un parámetro
  • No se pueden usar parámetros dentro de UDF o cualquier consulta de complejidad apreciable
  • Necesita buscar códigos de parámetros esotéricos según el controlador (OLEDB/ADO.Net/ODBC)
  • Del error anterior parece que el uso de un campo para un parámetro de alguna manera afecta la metatada en el resultado del campo de la consulta.

Respondido 18 Jul 13, 03:07

Recibo la siguiente excepción. lo he resuelto Explicaré el problema y los pasos que he tomado para resolver el problema.

    **Error Message :** The type of the value being assigned to 
variable differs from the current variable type..



              **When :** Executing SSIS package. SSIS package is calling batch script. 
        Batch script is calling Python script. SSIS package is expecting output from 
    batch file. After executing the batch file and python script output 
should be delivered to SSIS package.  But Here I am getting the exception.

    **Python Script writing output into stdout :** 
    //Python code start
    print >>sys.stdout, "output" 
    //Python code End
    So here the output is written to standard out.

        **Issue :**  When I am calling the batch file, I am writing the log 
into one log file.
    Please check the following batch script.
    //Batch File script start
    C:\Python25\python.exe GetValFromPYthonSCript.py > scriptLog.txt  
    //Batch File script End
        So what happend is, the output is written in the log.But again 
I tried to read the output using the following line in SSIS.
    //SSIS coding start
    Dim objProcess As Process
    objProcess = New Process()
    objProcess.StartInfo.FileName = "batchFile location"
    objProcess.start()
    System.Windows.Forms.MessageBox.Show(objProcess.StandardOutput.ReadLine())
    //SSIS coding End

    So when I am trying to display I am getting the above exception.

    **Fix** : Just I have removed the log. I did not write the output into the log file.
    C:\Python25\python.exe GetValFromPYthonSCript.py
    Now I am getting the output properly.

Respondido el 25 de Septiembre de 13 a las 04:09

SQL Server 2016 VS2015 Comunidad 14.0.25431.01 U3 SSDT 14.0.61712.050

Este picó mi cerebro por más tiempo del que me gustaría admitir. Tenía dos paquetes, cada uno con un procedimiento que devolvía una instrucción sql diferente que estaba asignada a una variable. Uno de los paquetes funcionó y otro no.

En el paquete/procedimiento de trabajo, tenía variable @sql declarado como varchar(max). Más adelante en la consulta, estaba agregando una fecha retrospectiva almacenada como una variable @dt varchar(7). yo estuve concatenando @dt a @sql.

En el paquete/procedimiento que no funciona, tenía variable @sql declarado como varchar(max). Más adelante en esta consulta, estaba agregando una fecha retrospectiva almacenada como una variable @dt varchar(max). En SSMS, este procedimiento funciona y devuelve la declaración que es ejecutable. Sin embargo, en SSIS, esto no funciona.

Una vez que cambié la última variable a una longitud de caracteres más corta (varchar(7)), la asignación de tarea/variable en VS tuvo éxito.

Espero que ayude.

Respondido el 18 de Septiembre de 18 a las 20:09

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