c# - tabla - importar txt a sql server 2012
¿Cuáles son los peligros de insertar millones de registros en SQL Server desde un archivo plano? (9)
¿Tienes que escribir una aplicación de winforms? Puede ser mucho más fácil y rápido usar SSIS. Hay algunas tareas integradas disponibles, especialmente la tarea de inserción masiva .
Además, vale la pena comprobar la comparación de velocidad de los métodos de importación a granel de archivos planos en SQL Server 2005.
Actualización: si es nuevo en SSIS, consulte algunos de estos sitios para ponerlo en camino rápido. 1) Fundamentos del flujo de control de SSIS 2) Primeros pasos con SQL Server Integration Services
Este es otro Cómo: en la importación de archivos de Excel en SQL 2005 .
Estoy a punto de comenzar un viaje escribiendo una aplicación de formularios de Windows que abrirá un archivo txt delimitado por tuberías y de aproximadamente 230 mb de tamaño. Esta aplicación luego insertará estos datos en una base de datos de SQL Server 2005 (obviamente, esto debe suceder rápidamente). Estoy usando c # 3.0 y .net 3.5 para este proyecto.
No estoy pidiendo la aplicación, solo algunos consejos comunales aquí y consejos potenciales. Desde el sitio que he reunido que SQL copia masiva es un requisito previo, ¿hay algo que debería pensar (creo que simplemente abrir el archivo txt con una aplicación de formularios será un gran esfuerzo, tal vez dividirlo en datos de blob?).
Gracias, y editaré la pregunta para mayor claridad si alguien la necesita.
Como nota al margen, a veces es más rápido soltar los índices de su tabla y recrearlos después de la operación de inserción masiva.
El tamaño de los datos de los que habla no es tan gigantesco. No sé cuáles son sus preocupaciones sobre la eficiencia, pero si puede esperar unas horas para que se inserte, se sorprenderá de lo fácil que sería lograr con una técnica realmente ingenua de simplemente INSERTAR cada fila de a una por vez . Unir miles y miles de filas a la vez y enviarlas al servidor SQL puede hacer que sea un poco más rápido también.
Solo una sugerencia que podría ahorrarle un tiempo de programación serio, si no necesita que sea tan rápido como sea posible. Según la frecuencia con la que se debe ejecutar esta importación, ahorrar unos días de tiempo de programación podría valer la pena a cambio de esperar unas horas mientras se ejecuta.
Esto va a ser un esfuerzo de transmisión.
Si puede, no use transacciones aquí. El costo transaccional simplemente será demasiado grande.
Entonces, lo que vas a hacer es leer el archivo una línea a la vez e insertarlo en línea a la vez. Debería volcar las inserciones fallidas en otro archivo que pueda diagnosticar más tarde y ver dónde fallaron.
Al principio me gustaría probar una inserción masiva de un par de cientos de filas solo para ver que la transmisión funciona correctamente y luego puedes abrir todo lo que quieras.
Podría considerar cambiar de recuperación completa a registro masivo. Esto ayudará a mantener sus copias de seguridad a un tamaño razonable.
Podría intentar usar SqlBulkCopy . Le permite extraer de "cualquier fuente de datos".
Puede usar SSIS para leer e insertar, pero llámelo como un paquete desde su aplicación WinForms. Luego podría pasar cosas como origen, destino, cadenas de conexión, etc. como parámetro / configuraciones.
HowTo: http://msdn.microsoft.com/en-us/library/aa337077.aspx
Puede configurar transformaciones y manejo de errores dentro de SSIS e incluso crear ramificaciones lógicas basadas en parámetros de entrada.
Si el formato de columna del archivo coincide con la tabla de destino donde los datos deben finalizar, prefiero usar la utilidad de línea de comandos bcp para cargar el archivo de datos. Es increíblemente rápido y puede especificar y archivo de error para cualquier registro "impar" que no se pueda insertar.
Su aplicación podría iniciar el comando si necesita almacenar los parámetros de la línea de comando (servidor, base de datos, nombre de usuario / contraseña o conexión confiable, tabla, archivo de error, etc.).
Me gusta más este método que ejecutar un comando BULK INSERT SQL porque no es necesario que el archivo de datos esté en un sistema al que pueda acceder el servidor de la base de datos. Para utilizar la inserción masiva, debe especificar la ruta al archivo de datos que se cargará, por lo que debe ser una ruta visible y legible por el usuario del sistema en el servidor de la base de datos que ejecuta la carga. Demasiada molestia para mí por lo general. :-)
Recomiendo totalmente SSIS, puede leer en millones de registros y limpiarlos en el camino en relativamente poco tiempo.
Tendrá que dedicar algo de tiempo para familiarizarse con SSIS, pero debería dar sus frutos. Hay algunos otros hilos aquí en SO que probablemente serán útiles:
¿Cuáles son los materiales de aprendizaje recomendados para SSIS?
También puedes crear un paquete desde C #. Tengo un programa de C # que lee un 3GL "archivo maestro" de un sistema heredado (analiza en un modelo de objetos usando una API que tengo para un proyecto relacionado), toma una plantilla de paquete y la modifica para generar un paquete para el ETL.