2009-01-28 32 views
7

Estoy migrando datos que deben insertarse utilizando procedimientos almacenados que ya existen. Los procedimientos almacenados tienen parámetros y un valor de retorno (de una declaración de selección) de una identificación para la fila insertada. Dentro de un comando OLE DB en SSIS, puedo llamar al procedimiento almacenado pasando valores de columna como los parámetros y usualmente uso los parámetros de salida en el procedimiento almacenado para manejar la salida "id"; pero no estoy seguro de cómo se puede manejar esto con los valores de retorno cuando el procedimiento utiliza una selección para devolver el valor de identificación. Aquí está un ejemplo de lo que he usado antes que funciona pero necesito para recoger el valor devuelto por el selecto:Valor de retorno de SSIS del Procedimiento almacenado dentro de un comando OLE DB

exec dbo.uspInsertContactAddress 
@Address = ?, 
@ContactID = ?, 
@DeliveryMethodId = ?, 
@ID = ? output, 
@Version = ? output 

Respuesta

12

La forma en que descubrí que podía hacer esto que en realidad era bastante simple:

exec ? = dbo.StoredProc @param = ?, @param2 = ? 

y luego aparecerá un @RETURN_VALUE en las columnas de destino disponibles

6

No utilice los nombres de las variables en la propiedad SqlCommand, sólo los signos de interrogación y de la Etiqueta "OUT" o "OUTPUT" para los parámetros de salida.

El truco para obtener el valor del parámetro de salida es colocar una transformación de columna derivada en la canalización antes del comando OLE DB para introducir una columna (asignada a una variable SSIS) para capturar el resultado del procedimiento.

Consulte OLEDB Command Transformation And Identity Columns para obtener una buena visión general con capturas de pantalla de cómo hacer esto. También vea Trash Destination Adapter para el destino de la basura utilizado en el primer enlace. Es una herramienta útil para tener disponible para depurar cosas como esta.

+0

Gracias por la respuesta, aunque quizás yo no' Explicaré en mi pregunta exactamente lo que necesito hacer. El código anterior que he usado funciona y puedo tomar valores si el procedimiento tiene un parámetro de salida. El problema es que los procedimientos que se usan para esta base de datos simplemente llaman a un selector para obtener un valor. – bobwah

+0

Lo siento, no estoy seguro de entender el problema. ¿Es que no está pasando el resultado de la selección a través de un parámetro de salida y en su lugar necesita una forma de agarrar el conjunto de resultados del proceso? –

0

Siempre he utilizado la asignación de parámetros dentro de la tarea Ejecutar SQL con mucho éxito. La instrucción SQL es "EXEC nameofstoredproc?,? OUTPUT", con los signos de interrogación que especifican la ubicación de los parámetros y OUTPUT si el parámetro es una salida.

Especifique los parámetros en la asignación con el nombre de variable, la dirección (entrada, salida, ReturnValue) y el tipo de datos adecuados. Como el proceso almacenado devuelve los datos que desea a través de un conjunto de resultados, especifique la dirección de las variables para recopilar el ID y la versión como ReturnValue. Debería funcionar bien para ti.

1

Si el procedimiento almacenado devuelve un conjunto de resultados, entonces usted necesita para capturarlo:

DECLARE @results TABLE (
    [ID] INT NOT NULL 
) 

INSERT @results ([ID]) 
EXEC dbo.uspInsertContactAddress @Address = ?, @ContactID = ?, @DeliveryMethodId = ?, @ID = ? output, @Version = ? output 

SELECT * FROM @results 

Nota: He utilizado una variable de tabla. Es posible que deba utilizar una tabla temporal según su versión de SQL Server.

Cuestiones relacionadas