2010-06-10 10 views
8

Tengo table a y table b. (SQL Server 2008)T-SQL - ¿Hay alguna forma (gratuita) de comparar datos en dos tablas?

Ambas tablas tienen exactamente el mismo esquema.

Para los fines de esta pregunta, considere table a = mi tabla de desarrollo local, table b = la tabla en vivo.

Necesito crear un script SQL (que contenga UPDATE/DELETE/INSERT declaraciones) que actualizará la tabla b para que sea la misma que la tabla a. Esta secuencia de comandos se implementará en la base de datos en vivo.

¿Hay alguna herramienta gratuita que pueda hacer esto o, mejor aún, puedo hacerlo yo mismo?

Estoy pensando que probablemente necesite hacer algún tipo de unión en todos los campos en las tablas, luego generar SQL dinámico basado en eso.

¿Alguien tiene alguna idea?

EDITAR

bien, pensé en aclarar esta cuestión un poco.

La tabla que necesito sincronizar es una tabla de búsqueda simple. La información es muy simple y directa.

He aquí una idea de lo que TABLE A podría ser:

IdFoo   Activity  IsFoo 
1    Foo   1 
2    Bar   0 

He aquí una idea de lo que TABLE B podría ser:

IdFoo   Activity  IsFoo 
1    Foo   1 
2    Bar   1 

Básicamente, todo lo que quiero hacer es actualizar que BIT columna (IsFoo) en TABLE B para que coincida con el valor correspondiente en TABLE A para el mismo IdFoo.

tener en cuenta:

  • TABLE A es en mi máquina local
  • TABLE B es en el servidor vivo

Obviamente tengo una copia de seguridad (fiable) de TABLE B en mi máquina local que Necesito script contra, luego ejecutar el script en el servidor en vivo.

La tabla también tiene integridad referencial (otras columnas que no se muestran). Lo que significa que no puedo simplemente borrar todo en TABLE B y hacer una inserción desde TABLE A.

Esta secuencia de comandos será una vez. Así que no hay necesidad de hacer cosas como servidor vinculado, replicación, etc. Aprecio las respuestas, chicos. =)

EDIT:

Ok - así que he ido con la respuesta de Oleg (VS2010 datos de comparación). Rápido, fácil y funciona un encanto.

No decir que las otras respuestas son incorrectas. Aprecio todas las respuestas!

+0

Cualquier respuesta dependería en gran medida del hecho si tiene un campo que se puede usar confiablemente para unir dos filas. –

+0

La respuesta también depende de la frecuencia con la que necesita hacer esto y de la extensión de los datos. Si se trata de algo de una sola vez, puede usar el asistente de importación/exportación para transferir 'tabla b' a' tabla a'. Si desea que los cambios se reflejen de forma inmediata y continua, puede implementar la Replicación. – codingbadger

Respuesta

5

En casos muy simples podrá definir en su Servidor SQL local un nuevo Servidor Vinculado (ver en Microsoft SQL Server Management Studio en "Servidores"/"Servidor Vinculado") y usar INNER JOIN y OUTER JOIN para averiguar diferencias entre tablas A y B

En una situación real y más compleja, debe tener en cuenta Integridad referencial, diferentes claves externas e Identity (auto incremental) campos existentes en la base de datos de destino, por lo que el script de actualización será más complejo. Por lo tanto, le recomendaré que no dedique tiempo a crear la sincronización de su desarrollador y base de datos de producción, sino que utilice una herramienta estándar. Utilizo, por ejemplo, las características de Visual Studio Team Edition 2008 (o edición de base de datos) o Visual Studio 2010 Ultimate Edition para comparar datos en dos bases de datos. Funciona muy bien.

+0

Tengo VS2010: ¿cómo se comparan los datos en dos bases de datos con eso? ¿Tiene una referencia/enlace? – RPM1984

+1

Simplemente entre en el menú "Datos", seleccione "Comparación de datos" y "Nueva comparación de datos". Luego elija bases de datos de origen y destino y "Opciones de comparación de datos". Luego sigue al asistente. Al final puede examinar la comparación de resultados, "eliminar" algunas diferencias y escribir las modificaciones directamente en la base de datos de destino o generar una secuencia de comandos SQL. En el menú "Herramientas" "Opciones" puede elegir algunas opciones de generación de código. No solo puede comparar datos, sino también comparar esquemas de bases de datos si es necesario. – Oleg

+0

Genial - vale, déjate llevar mañana (cuando vuelvas al trabajo) y deja que sepas cómo voy - ¡aplausos por la propina! – RPM1984

4

Hay SQL Data Compare de RedGate (aunque no es gratis) y también hay SMO y built in functionallity.

Finalmente Wikipedia tiene una lista bastante completa de software.

+1

La herramienta de comparación de datos SQL RedGate no es gratuita. SMO es una buena idea, y el enlace de Wikipedia es una gran fuente. –

+1

Lo siento, Bernard. Leí mal parte de la pregunta y de alguna manera la interpreté como si se prefiriera la opción gratuita, aunque opcional. He editado la respuesta para reflejar eso. Necesito más café, supongo. – Don

+0

El enlace de wikipedia ahora, molesto. simplemente redirige a la página principal de SQL Server. – Fishcake

2

Puede utilizar un generador de scripts de datos que crea secuencias de comandos para las inserciones, y luego utilizar una herramienta de comparación de archivos como WinMerge para comparar los archivos y encontrar las diferencias. Hay un artículo sobre cómo generar los scripts de datos en el proyecto de código: http://www.codeproject.com/KB/database/sqlinsertupdategenerator.aspx

5

Si solo desea sincronizar las tablas y no le importa revisar los cambios por adelantado, el comando MERGE puede hacerlo.

MSDN - MERGE (Transact-SQL)

El (gratis) Microsoft SSDT también tiene datos de comparación y sincronización construidos en aunque es más limitado que herramientas de pago tales como comparar datos Redgate.

0

También puede intentar usar el import and export data provisto por SQL Server 2008. Es una forma bastante directa de copiar toda la información desde cualquier lugar a cualquier lugar. Hago lo mismo y funciona perfectamente.

3

ya que es uno fuera, puede utilizar esta consulta para buscar las filas que son diferentes en estas dos tablas:

(SELECT * FROM TABLE_A 
MINUS 
SELECT * FROM TABLE_B) 

UNION ALL 

(SELECT * FROM TABLE_B 
MINUS 
SELECT * FROM TABLE_A) 

MINUS compararán los registros de campo por campo, entonces se descartará los registros de la primera tabla de que hay un registro idéntico en la segunda tabla. Esto funciona así:

  • Primera MINUS recibe todos los registros de TABLE_A que no están en TABLE_B
  • Segunda MINUS recibe todos los registros de TABLE_B que no están en TABLE_A
  • Unión recibe todos los registros de ambas tablas para el cual no hay registro coincidente en otra tabla.

Ahora puede insertar esos registros en alguna tabla temporal y luego hacer inserciones/actualizaciones.

Dependiendo de sus necesidades, puede restringir la lista de campos para comparar.

Tenga en cuenta que necesita la clave principal para que esto funcione.

Editar:
Lamentablemente. SQL Server no es compatible con el operador MINUS. Estoy trabajando con ORACLE el año pasado y la mitad, así que esto fue automático.

Puede usar el operador EXCEPT en su lugar. Ver este artículo: EXCEPT and INTERSECT (Transact-SQL)

Edición 2:

Re scherand's comentario:
Si realmente no se puede conectar a la máquina local del servidor de vivir, de lo que simplemente puede volcar TABLE_A y cargarlo en el servidor. De una forma u otra, el objetivo es cambiar los datos de la tabla en el servidor en vivo.

+0

Interesante ... nunca escuché acerca de la palabra clave MINUS. Voy a dar una oportunidad también (y sí, la primera columna es una identidad PK). – RPM1984

+0

Eso no funciona, a menos que OP pueda definir su estación de trabajo/servidor en vivo como servidor vinculado (como @Oleg señalado) ... Citar: "Tenga en cuenta: la TABLA A está en mi máquina local TABLA B está encendida el servidor en vivo " – scherand

0

Usted puede tratar de nuestra Schema Compare for SQL Server

Esta herramienta no está libre (que es una version de prueba), pero se puede utilizar 30 días de prueba gratis, y también, usted tiene la oportunidad de obtener una licencia libre para este producto - por favor consulte nuestro free license conditions page.

3

me encontré en el mismo problema que tú - buscado una herramienta gratuita que compara los datos de dos tablas de MS SQL - y no encontró nada. Luego creé una utilidad de línea de comandos de freeware simple. Compara los datos de dos tablas y crea INSERT/DELETE/UPDATE statemenets para hacer que los datos de la tabla de destino sean los mismos que los de origen. Ahora lo estoy usando para la comparación de datos, y ya que es completamente libre, puedo recomendar para comprobar hacia fuera en: Sourceforge.net - UltraDBC

0

lo que sucede si usted:

  1. copia devTableA en prod,
  2. suspender dependencias en prodTableB
  3. renombrar prodTable B a prodTableB1,
  4. renombrar devTableA a prodTableB
  5. dependencias reimplementar el nuevo prodTableB
  6. probar nuevo prodTableB y luego eliminar el nombre obsoleto anterior prodTableB

?

o si tiene que ser más respetuosos con el sus valores de columna de identidad en tanto dev y prod partido (incluso si los valores no son continuas) prodTableB existente y ...

declare @iLast int, @x int, @y int 
select @iLast = (select MAX(id) from prodTableB) 
set @x = 1 
while @x <= @iLast 
begin 
    select @y = (select COUNT(*) from prodTableB where id = @x) 
    if @y = 1 
    begin 
     update prodTableB set isFoo = (select isFoo from devTableA where [email protected] 
    end 
    @[email protected]+1 
end 
6

respuesta tardía pero puede ser útil para los visitantes del hilo

Además de otras soluciones mencionadas, puedo sugerir intentar ApexSQL Data Diff. Puede comparar y sincronizar los datos de la base de datos de SQL Server (en bases de datos en vivo, así como copias de seguridad) y automatizar y programar las migraciones de datos. También funciona con enormes bases de datos, y puede realizar comparaciones directamente desde SSMS.

Puedes descargar esta herramienta gratis y jugar con ella. Cuenta con una versión de prueba totalmente funcional y ofrece una edición de comunidad (después de que termine el período de prueba) que funciona en SQL Express y Azure SQL Database.

Para obtener más información sobre la herramienta, puede visitar http://www.apexsql.com/sql_tools_datadiff.aspx

0

También puede echar un vistazo a xSQL Data Compare. La versión de SQL Express es gratuita y también hay una versión Lite que servirá para pequeñas bases de datos.

Una buena herramienta gratuita también se compara datos de SSDT.

Descargo de responsabilidad: Estoy afiliado con xSQL.

Cuestiones relacionadas