2009-05-18 25 views
6

Estoy tratando de actualizar un campo en una tabla con datos de otra tabla, basado en una clave común. Si estuviera en SQL recta, sería algo así como:Actualizar tabla usando SSIS

Update EHSIT 
set e.IDMSObjID = s.IDMSObjID 
from EHSIT e, EHSIDMS s 
where e.SITENUM = s.SITE_CODE 

Sin embargo, las dos tablas no están en la misma base de datos, por lo que estoy tratando de usar SSIS para realizar la actualización. Ah, y el sitenum/site_code son varchar en uno y nvarchar en el otro, así que tendré que hacer una conversión de datos para que coincidan.

¿Cómo lo hago?
Tengo un objeto de flujo de datos, con la fuente como EHSIDMS y el destino como EHSIT. Tengo una conversión de datos para convertir el Unicode a no Unicode. ¿Pero cómo actualizo basado en el partido? Lo he intentado con el destino, utilizando un comando SQL como modo de acceso a datos, pero no parece tener la tabla fuente. Si solo asigno el campo para actualizar, ¿cómo lo limita en función de los campos coincidentes?

Estoy a punto de exportar mi tabla fuente a Excel o algo así, y luego intentar ingresar desde allí, aunque parece que todo lo que obtendría sería eliminar el paso de conversión de datos.

¿No debería haber una tarea de actualización de datos o algo así? ¿Es una de esas tareas de transformación de flujo de datos, y simplemente no estoy descifrando cuál es?

Respuesta

8

Puede usar el SQLCommand (con parámetros) pero efectivamente estará escribiendo un UPDATE para cada fila. He encontrado que es mejor escribir una tabla de etapas en el lado de destino (ya sea todos los datos del lado remoto o los datos determinados por SSIS para cambiarlos) y usar un solo SQL UPDATE para realizar la actualización.

+1

Ok, eso funciona. Creé una tabla temporal en mi db de destino, copié datos en ella y luego usé la declaración de actualización para llenar mi campo. Borre la tabla temporal, y listo. Gracias. – thursdaysgeek

+1

Intente siempre utilizar una tabla de etapas, intente pensar en bloques de datos. Si tiene 1 millón de registros que necesitan ser actualizados, es muy lento actualizar cada registro con una declaración de actualización. Por lo tanto, debe usar 1 sola tabla y declaración para hacer sus actualizaciones. – JSC

2

Siempre puede usar el nombre completo de la base de datos.

UPDATE server1.databasename.EHSIT 
SET E.IDMSOBJID = S.IDMSOBJID 
FROM server1.databasename.EHSIT E, server2.databasename.EHSIDMS S 
WHERE E.SITENUM = S.SITE_CODE 



[serverpath].[database].[databaseobject] 
0

He encontrado que el uso de una dimensión cambiando poco a poco, con la clave de negocio como el valor que está devueltos localizados en y los demás atributos que desea actualiza a medida que el cambio de valores parece funcionar.

Devtron, he intentado esto y he recibido errores sobre la ruta del servidor, hay un montón de/'s en él. También me dijeron que esto es muy despreciado, especialmente si se trata de una operación que ocurre mucho.

+2

Cambiar Dimensiones lentamente hará el trabajo, pero es MUY lento en grandes cantidades de datos (debido al hecho de que realiza acciones fila por fila - vea el comentario anterior de JSC) –

+0

¿Mirado hacia abajo? Yo creo que no. Usando mi ejemplo UPDATE, ni siquiera necesita SSIS para realizar la transacción. También depende de la configuración de su red y de las configuraciones de su Base de datos vinculada. – D3vtr0n

Cuestiones relacionadas