una tablas soporta segundo rapida porque por para optimizar mas lentas lenta las hacer grandes dañan datos cuantas consultas consulta como cantidades c# sql-server ado.net

c# - soporta - porque se dañan las tablas en mysql



Copie de una tabla de base de datos a otra C# (5)

Usando C # (vs2005) necesito copiar una tabla de una base de datos a otra. Ambos motores de base de datos son SQL Server 2005. Para la base de datos remota, la fuente, solo tengo acceso de ejecución a un procedimiento almacenado para obtener los datos que necesito traer localmente.

La base de datos local sobre la que tengo más control es utilizada por la aplicación [asp.net] que necesita una copia local de esta tabla remota. Nos gustaría que sea local para una búsqueda más fácil y se una a otras tablas, etc.

¿Podría explicarme un método eficiente para copiar estos datos en nuestra base de datos local?

La tabla local se puede crear con el mismo esquema que la remota, si hace las cosas más simples. La tabla remota tiene 9 columnas, ninguna de las cuales son columnas de identidad. Hay aproximadamente 5400 filas en la tabla remota, y este número crece en aproximadamente 200 por año. Entonces no es una mesa que cambia rápidamente.



No parece ser una gran cantidad de datos que tiene que sincronizar. En las condiciones que describió (solo SP para acceder a la base de datos remota y no se puede obtener nada más), puede elegir la solución de Marc Gravell. En el caso de que los datos solo puedan crecer y los datos existentes no se puedan modificar, puede comparar el recuento de registros en DB remoto e interno para optimizar el funcionamiento; si no hay cambio en DB remoto no es necesario copiar.


Primero vería el uso de SQL Server Intergration Services (SSIS, Servicios de transferencia de datos (DTS) née).

Está diseñado para mover / comparar / procesar / transformar datos entre bases de datos, y IIRC permite una expresión arbitraria para la fuente. Lo necesitaría instalado en su base de datos (no debería ser un problema, es parte de una instalación predeterminada).

De lo contrario, una solución de código, dado el tamaño de los datos (pequeño), extrae todos los datos del sistema de eliminación en una estructura interna, y luego busca las filas que no existen localmente para insertar.


Probablemente no pueda hacer esto, pero si no puede hacerlo, NO lo haga con un programa. Si tiene alguna forma de hablar con alguien que controla el servidor de origen, vea si configurará algún tipo de exportación de los datos. Si los datos son tan pequeños como usted dice, entonces la salida xml o csv sería 100 veces mejor que escribir algo en c # (o en cualquier idioma).

Asumamos que no pueden exportar, aún así, evitan escribir un programa. Usted dice que tiene más control sobre el destino. ¿Puede configurar un paquete SSIS o configurar un servidor vinculado? De ser así, le resultará mucho más fácil migrar los datos.

Si configura al mínimo la fuente como un servidor vinculado, puede escribir un pequeño lote de t-sql para

TRUNCATE DestTable

INSERT INTO DestTable SELECT SourceTable.Star FROM [SourceServer]. [Schema]. [Table]

no sería tan bueno como SSIS (tienes más visual de lo que está sucediendo, pero el t-sql anterior es bastante claro).

Como no tomaría la ruta de programación, la mejor solución que podría darle sería, si tuviera que:

Use el espacio de nombres SqlClient.

Entonces, crea 2 SqlConnections, 2 SqlCommands, y obtén la instancia de 1 SqlReader.

Itere a través del lector fuente y ejecute la inserción SqlCommand de destino para cada iteración con el.

Será feo, pero funcionará.


Tal vez SqlBulkCopy; utilice SqlCommand.ExecuteReader para obtener el lector que usa en la llamada a SqlBulkCopy.WriteToServer. Esto es lo mismo que la inserción masiva, muy rápido. Debería verse algo así como (no probado);

using (SqlConnection connSource = new SqlConnection(csSource)) using (SqlCommand cmd = connSource.CreateCommand()) using (SqlBulkCopy bcp = new SqlBulkCopy(csDest)) { bcp.DestinationTableName = "SomeTable"; cmd.CommandText = "myproc"; cmd.CommandType = CommandType.StoredProcedure; connSource.Open(); using(SqlDataReader reader = cmd.ExecuteReader()) { bcp.WriteToServer(reader); } }