2012-04-18 14 views
6

SSIS 2008. Tarea muy simple. Quiero recuperar una variable del sistema y usarla en un INSERT de SQL. Quiero recuperar el valor de System:MachineName y usarlo en una declaración de inserción.¿Cómo paso el valor de la variable del sistema a la declaración SQL en la tarea Ejecutar SQL?

Utilización de la sentencia INSERT INTO MYLOG (COL1) SELECT @[System::MachineName] da el error Error: ..failed to parse. Must declare the scalar variable "@"

Usando las declaraciones SELECT @System::MachineName o SELECT @@[System::MachineName] da el error 'Error Incorrect systax near '::'

yo no estoy tratando de pasar un parámetro a la consulta. ¡He buscado un día pero no he podido encontrar cómo hacerlo!

Respuesta

14

Esta es una forma de hacerlo. El siguiente paquete de muestra se creó usando SSIS 2008 R2 y utiliza SQL Server 2008 R2 como back-end.

  • Crear una tabla de ejemplo en su base de datos SQL Server llamado dbo.PackageData

Table structure

  • Crear un paquete SSIS.
  • En el SSIS, agregue un administrador de conexión OLE DB llamado SQLServer para conectarse a su base de datos, por ejemplo, a una base de datos de SQL Server.
  • En la pestaña Flujo de control, arrastre y suelte Execute SQL Task
  • Haga doble clic en la tarea Ejecutar SQL para colocar el Editor de tareas SQL de ejecución.
  • En la pestaña General del editor, establezca la propiedad Connection en su administrador de conexión llamado SQLServer.
  • En la propiedad SQLStatement, introduzca la instrucción de inserción INSERT INTO dbo.PackageData (PackageName) VALUES (?)

General tab

  • En la ficha de asignación de parámetros, haga clic en el botón Agregar, seleccione la variable de paquete que desea utilizar. Cambie el tipo de datos en consecuencia. Este ejemplo va a insertar PackageName en una tabla, por lo que Data Type sería VARCHAR. Establezca el nombre Parameter en 0, que indica el valor de índice del parámetro. Haga clic en el botón Aceptar.

Parameter Mapping tab

  • ejecutar el paquete.
  • Notará un nuevo registro insertado en la tabla. Retení el nombre del paquete como Paquete. Es por eso que la mesa

Package data

Espero que ayude.

+1

Respuesta perfecta, y muy bien presentada. Intenté este proceso antes, y nunca funcionó. Mi 'error' fue establecer 'BypassPrepare' en False, luego usando 'Parse Query', que siempre devolvió un mensaje de error. Configurar 'Bypass Prepare' a True fue el truco secreto mágico. Sospeché que era algo simple y no bien documentado. ¡Muchas gracias, Siva! 4 estrellas y una cara sonriente para ti. – mroselius

+0

Acabo de enterarme de lo que significa el "signo de interrogación" y ahora tiene sentido. Gracias por esta completa solución. Además, tus imágenes están rotas, así que las eliminé. Siéntase libre de volver a agregarlos. – Vippy

1

Nunca lo uso antes, pero tal vez pueda verificar el uso de la expresión en la tarea Ejecutar SQL para eso.

O simplemente coloque toda la consulta en una expresión de una variable con evaluateAsExpression establecido en verdadero. A continuación, utilice OLE DB para insertar

+1

+1 Esta es mi humilde opinión la respuesta correcta. La pregunta del OP es prácticamente el caso de uso de las expresiones de propiedad de SSIS. Para pasar variables de SSIS a la cadena de consulta, se la concatenaría en una expresión establecida para la propiedad 'SqlStatementSource'; '" INSERT INTO MYLOG (COL1) SELECT "+ @ [System :: MachineName]'. Esto no es para sugerir que la respuesta aceptada no es un buen patrón. – Sepster

1

Por mi comentario en contra de la respuesta de @ ZERO (repetida aquí como respuesta para que los recién llegados a SSIS no la pasen por alto).

La pregunta del OP es prácticamente el caso de uso de las expresiones de propiedades de SSIS.

para pasar variables SSIS en la cadena de consulta se podría concatenar en una expresión establecido para la propiedad SqlStatementSource:

"INSERT INTO MYLOG (COL1) SELECT " + @[System::MachineName]

Esto no es sugerir la respuesta aceptada no es un buen patrón, como se en general, el enfoque parametrizado es más seguro (contra inyección de SQL) y más rápido (en reutilización) que la manipulación directa de cadena de consulta. Pero para una variable de sistema (a diferencia de una cadena ingresada por el usuario) esta solución debe estar a salvo de la inyección de SQL, y esto será más o menos rápido que una consulta parametrizada si se vuelve a usar (ya que el nombre de la máquina no cambia)

0

Junto con la respuesta de @ user756519, dependiendo de su cadena de conexión, los nombres de las variables y SQLStatementSource Cambios

https://docs.microsoft.com/en-us/sql/integration-services/control-flow/execute-sql-task

Cuestiones relacionadas