sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo paso valor a un parámetro de procedimiento almacenado en el componente de origen OLE DB?

Conceptualmente, el aspecto que tendrá su solución es ejecutar su consulta de origen para generar su conjunto de resultados. Guárdelo en una variable y luego deberá iterar a través de esos resultados y para cada fila, querrá llamar a su procedimiento almacenado con el valor de esa fila y enviar los resultados a un nuevo archivo de Excel.

Me imagino que su paquete se verá así

Una tarea de ejecución de SQL, denominada "Conjunto de registros de carga de SQL", adjunta a un contenedor de bucle Foreach, denominado "Conjunto de registros de trituración FELC". Anidado dentro, tengo una tarea del sistema de archivos, denominada "Plantilla de copia de FST", que es una prioridad para una tarea de flujo de datos, denominada "Generar salida de DFT".

Configurar

Como eres un principiante, voy a tratar de explicarte en detalle. Para ahorrarse molestias, obtenga una copia de BIDSHelper. Es una herramienta gratuita de código abierto que mejora la experiencia de diseño en BIDS/SSDT.

Variables

Haga clic en el fondo de su Flujo de control. Sin nada seleccionado, haga clic derecho y seleccione Variables. En la nueva ventana que aparece, haga clic en el botón que crea una nueva variable 4 veces. La razón para no hacer clic en nada es que hasta SQL Server 2012, el comportamiento predeterminado de la creación de variables es crearlas en el ámbito del objeto actual. Esto ha resultado en la pérdida de muchos cabellos tanto para los desarrolladores nuevos como para los experimentados. Los nombres de las variables distinguen entre mayúsculas y minúsculas, así que tenga esto en cuenta también.

  1. Renombrar variable a RecordSet. Cambie el tipo de datos de Int32 a Objeto
  2. Cambie el nombre de Variable1 a ParameterValue. Cambie el tipo de datos de Int32 a String
  3. Cambie el nombre de Variable2 a TemplateFile. Cambie el tipo de datos de Int32 a String. Establezca el valor en la ruta de su archivo de salida de Excel. Usé C:\ssisdata\ShredRecordset.xlsx
  4. Cambie el nombre de la variable 4 a OutputFileName. Cambie el tipo de datos de Int32 a String. Aquí vamos a hacer algo ligeramente avanzado. Haga clic en la variable y presione F4 para que aparezca la ventana Propiedades. Cambie el valor de EvaluateAsExpression a True. En Expression, configúrelo en "C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx" (o cualquiera que sea su archivo y ruta). Lo que esto hace es configurar una variable para que cambie a medida que cambia el valor de ParameterValue. Esto ayuda a garantizar que obtengamos un nombre de archivo único. Le invitamos a cambiar la convención de nomenclatura según sea necesario. Tenga en cuenta que debe escapar del \ cada vez que esté en una expresión.

Administradores de conexiones

Supuse que está utilizando un administrador de conexión OLE DB. El mío se llama FOO. Si está utilizando ADO.NET, los conceptos serán similares, pero habrá matices relacionados con los parámetros y demás.

También necesitará un segundo Connection Manager para manejar Excel. Si SSIS es temperamental con respecto a los tipos de datos, Excel es completamente psicótico y te apuñala por la espalda con un tenedor mientras duermes con respecto a los tipos de datos. Vamos a esperar y dejar que el flujo de datos realmente cree este Administrador de conexión para garantizar que nuestros tipos sean buenos.

Consulta de origen a conjunto de resultados

El SQL Load Recordset es una instancia de la tarea Ejecutar SQL. Aquí tengo una consulta simple para imitar su fuente.

SELECT 'aq' AS parameterValue
UNION ALL SELECT 'dr'
UNION ALL SELECT 'tb'

Lo que es importante tener en cuenta en la pestaña General es que he cambiado mi ResultSet de None a Full result set . Hacer esto hace que la pestaña Conjunto de resultados pase de estar atenuada a ser utilizable.

Puede observar que he asignado el Nombre de variable a la variable que creamos anteriormente (Usuario::Conjunto de registros) y Si el nombre del resultado es 0 . Eso es importante como valor predeterminado, NewResultName no funciona.

Conjunto de registros triturados FELC

Tome un contenedor de bucle Foreach y lo usaremos para "triturar" los resultados que se generaron en el paso anterior.

Configure el enumerador como un Foreach ADO Enumerator Usar User::RecordSet como su variable fuente de objeto ADO. Seleccione rows in the first table como su modo de enumeración

En la pestaña Asignaciones de variables, deberá seleccionar su variable User::ParameterValue y asígnele el índice de 0. Esto dará como resultado que el elemento cero en su objeto de conjunto de registros se asigne a la variable ParameterValue. Es importante que tenga un acuerdo de tipo de datos, ya que SSIS no realizará conversiones implícitas aquí.

Plantilla de copia de FST

Esta es una tarea del sistema de archivos. Vamos a copiar nuestro archivo de plantilla de Excel para que tengamos un archivo de salida bien nombrado (que tenga el nombre del parámetro). Configurarlo como

  • EsDestinationPathVariable:Verdadero
  • Variable de destino:Usuario::Nombre del archivo de salida
  • Sobrescribir destino:Verdadero
  • Operación:Copiar archivo
  • IsSourcePathVariable:Verdadero
  • Variable de origen:Usuario::Archivo de plantilla

Generar salida de DFT

Esta es una tarea de flujo de datos. Supongo que solo está volcando los resultados directamente en un archivo, por lo que solo necesitaremos una fuente OLE DB y un destino de Excel

OLEDB dbo_procedimiento almacenado1

Aquí es donde sus datos se extraen de su sistema de origen con el parámetro que trituramos en el Flujo de control. Voy a escribir mi consulta aquí y usar el ? para indicar que tiene un parámetro.

Cambie su modo de acceso a datos a "Comando SQL" y en el texto del comando SQL que está disponible, coloque su consulta

EXECUTE dbo.storedProcedure1 ?

Hago clic en el botón Parámetros... y lo completo como se muestra

  • Parámetros:@parameterValue
  • Variables:Usuario::ValorParámetro
  • Dirección del parámetro:Entrada

Conecte un destino de Excel al origen de OLE DB. Haga doble clic y, en la sección Administrador de conexiones de Excel, haga clic en Nuevo... Determine si necesita el formato 2003 o 2007 (.xls frente a .xlsx) y si desea que su archivo tenga filas de encabezado. Para su ruta de archivo, ingrese el mismo valor que usó para su variable @User::TemplatePath y haga clic en Aceptar.

Ahora necesitamos completar el nombre de la hoja de Excel. Haga clic en el botón Nuevo... y es posible que ladre que no hay suficiente información sobre los tipos de datos de asignación. No te preocupes, eso es semi-estándar. Luego aparecerá una definición de tabla algo así como

CREATE TABLE `Excel Destination` (
    `name` NVARCHAR(35),
    `number` INT,
    `type` NVARCHAR(3),
    `low` INT,
    `high` INT,
    `status` INT
)

El nombre de la "tabla" será el nombre de la hoja de trabajo, o precisamente, el conjunto de datos con nombre en la hoja de trabajo. Hice la mía Sheet1 e hice clic en Aceptar. Ahora que la hoja existe, selecciónela en el menú desplegable. Elegí Sheet1$ como el nombre de la hoja de destino. No estoy seguro si hace la diferencia.

Haga clic en la pestaña Asignaciones y las cosas deberían autoasignarse correctamente, así que haga clic en Aceptar.

Finalmente

En este punto, si ejecutamos el paquete, sobrescribirá el archivo de plantilla cada vez. El secreto es que debemos decirle que Excel Connection Manager acabamos de hacer que no necesita tener un nombre codificado.

Haga clic una vez en el Administrador de conexión de Excel en la pestaña Administradores de conexión. En la ventana Propiedades, busque Expressions sección y haga clic en los puntos suspensivos ... Aquí configuraremos la Propiedad ExcelFilePath y la expresión que usaremos es @[User::OutputFileName]

Si sus íconos y demás se ven diferentes, eso es de esperar. Esto se documentó con SSIS 2012. Su flujo de trabajo será el mismo en 2005 y 2008/2008R2, solo que la máscara es diferente.

Si ejecuta este paquete y ni siquiera se inicia y hay un error sobre ACE 12 o Jet 4.0 algo que no está disponible, entonces está en una máquina de 64 bits y necesita decirle a BIDS/SSDT que desea ejecutar en 32 bits modo.

Asegúrese de que el valor Run64BitRuntime sea False . Esta configuración del proyecto se puede encontrar haciendo clic con el botón derecho en el proyecto, expanda las Propiedades de configuración y será una opción en Depuración.

Lecturas adicionales

Puede encontrar un ejemplo diferente de trituración de un objeto de conjunto de registros en ¿Cómo automatizar la ejecución de un procedimiento almacenado con un paquete SSIS?