Comprobar igualdad de tablas

29/09/2004 - 11:47 por Kano | Informe spam
Buenas, estoy haciendo comprobaciones de consistencia de tablas. Tengo
tablas de varias decenas de campos de distintos tipo (strings numéricos,
fechas, etc) tengo q comprobar q no hay diferencias entre los campos de las
dos tablas (muy similares en estructura)
Ahora mismo lo estoy haciendo comprobnando campo a campo si son iguales mas
o menos de la siguiente manera

select t1.* from tabla1 as t1
inner join tabla2 as t2 on t1.campoclave=t2.campoclave
where
t1.campo1<>t2.campo1 or
t1.campo2 not like t2.campo2 or --cadenas de texto
[...]

el caso esq tengo q hacer muchas tablas con muchos registros y esto es
bastante tedioso. Me podriais sugerir algun modo de comparar directamente
dos registros a ver si son iguales (todos los campos de una sola tacada), o
en su defecto alguna forma rapida para hacerlo?
el objetivo de esto es pocesar sobre la tabla2 los registros q han variado
en la tabla1 (no tiene pq ser reescribirlos)


Gracias por adelantado

Kano.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
29/09/2004 - 11:53 | Informe spam
Tienes herramientas de terceros (por ejemplo en Red Gate) que te
comparan estructuras y también datos, pero lo que hacen es lo que tú estás
haciendo, sólo que ellas te quitan de realizar ese trabajo tedioso que
comentas... si no tienes una herramienta así no hay otra forma de hacerlo :(


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Kano" <kano01ATterraDOTes> escribió en el mensaje
news:
Mostrar la cita
las
Mostrar la cita
mas
Mostrar la cita
o
Mostrar la cita
#2 Kano
29/09/2004 - 12:00 | Informe spam
Muchas gracias ... seguire con ello hasta q me canse y luego continuare un
poco mas ... :S

por cierto, pensaba en algo asi como el obj.gethash() de los lenguajes de
.net, asi comparando los hash de dos registros podría saber si son iguales
sin entrar en detalles. pero creo q eso es pedir demasiado a tsql

gracias de todas maneras

Kano


"Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
news:
Mostrar la cita
:(
Mostrar la cita
directamente
Mostrar la cita
tacada),
Mostrar la cita
variado
Mostrar la cita
#3 Carlos Sacristan
29/09/2004 - 12:25 | Informe spam
Bueno, algo así existe en SQL Server: las funciones CHECKSUM y
BINARY_CHECKSUM devuelven el mismo valor siempre y cuando la lista de
argumentos que se les pasan son iguales. Según eso, si haces

SELECT CHECKSUM(*) FROM tabla1 WHERE campoPK=1
SELECT CHECKSUM(*) FROM tabla2 WHERE campoPK=1

te devolvería el mismo valor siempre y cuando la estructura de las
tablas sea idéntica, pero según comentaste ese no es tu caso. Si realmente
fueran idénticas, la instrucción válida sería entonces

SELECT t1.CampoPK
FROM (SELECT campoPk, CHECKSUM(*) valorHash FROM t1) t1 INNER JOIN
(SELECT campoPk, CHECKSUM(*) valorHash FROM t2) t2 ON t1.campoPK t2.campoPK
WHERE t1.valorHash<> t2.valorHash

Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Kano" <kano01ATterraDOTes> escribió en el mensaje
news:
Mostrar la cita
estás
Mostrar la cita
hacerlo
Mostrar la cita
numéricos,
Mostrar la cita
de
Mostrar la cita
iguales
Mostrar la cita
#4 Kano
29/09/2004 - 15:47 | Informe spam
perfecto.
no son identicas, t2 tiene algunas columnas mas (el resto son identicas),
pero creo q haciendo un select adecuadamente de las columnas sobre las q se
aplica el checksum funcionara.

Muchas gracias, si funciona te debo una M ;-)


Kano


"Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
news:
Mostrar la cita
un
Mostrar la cita
de
Mostrar la cita
iguales
Mostrar la cita
Tengo
Mostrar la cita
es
Mostrar la cita
#5 Javier Loria
29/09/2004 - 16:16 | Informe spam
Hola:
Talvez podrias usar el siguiente codigo que te genera el SELECT basado
en las vistas del Information_Schema, reemplaza los valores de Tabla1,
Tabla2 con los nombres de tus tablas
ÞCLARE @Tabla1 SYSNAME
DECLARE @Tabla2 SYSNAME
DECLARE @Columna SYSNAME
DECLARE @Tipo SYSNAME
DECLARE @SELECT VARCHAR(1000)
DECLARE @ON VARCHAR(1000)
DECLARE @WHERE VARCHAR(1000)

SET @Tabla1='Tabla1' -- *** Poner Tabla
SET @Tabla2='Tabla2' -- *** Poner Tabla

DECLARE ColumnasIguales
CURSOR FOR
SELECT T1.COLUMN_NAME
, T1.DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS AS T1
JOIN INFORMATION_SCHEMA.COLUMNS AS T2
ON T1.TABLE_NAME=@Tabla1
AND T2.TABLE_NAME=@Tabla2
AND T1.COLUMN_NAME=T2.COLUMN_NAME
AND T1.DATA_TYPE=T2.DATA_TYPE
FOR READ ONLY

SET @SELECT='SELECT T1.*'+CHAR(13)+CHAR(10)+'FROM '+@Tabla1+' AS
T1'+CHAR(13)+CHAR(10)+'JOIN '+@Tabla2+' AS T2'+CHAR(13)+CHAR(10)
SET @ON=''
SET @WHERE=''
OPEN ColumnasIguales
FETCH NEXT FROM ColumnasIguales
INTO @Columna, @Tipo

WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS TU
ON TC.CONSTRAINT_NAME=TU.CONSTRAINT_NAME
WHERE CONSTRAINT_TYPE='PRIMARY KEY'
AND TC.TABLE_NAME=@Tabla1
AND TU.COLUMN_NAME=@Columna)
BEGIN
IF (@ON='')
BEGIN
SET @ON='ON '
END
ELSE
BEGIN
SET @ON=@ON+CHAR(13)+CHAR(10)+' AND '
END
SET @ON=@ON+'T1.'+@Columna+'=T2.' + @Columna
END
ELSE
BEGIN
IF (@WHERE='')
BEGIN
SET @WHERE=CHAR(13)+CHAR(10)+'WHERE '
END
ELSE
BEGIN
SET @WHERE=@WHERE+CHAR(13)+CHAR(10)+' OR '
END
SET @WHERE=@WHERE+'T1.'+@Columna+'<>T2.'+@Columna
END
FETCH NEXT FROM ColumnasIguales
INTO @Columna, @Tipo
END
PRINT @SELECT+@ON+@WHERE
CLOSE ColumnasIguales
DEALLOCATE ColumnasIguales
= Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"Kano" <kano01ATterraDOTes> wrote in message
news:
Mostrar la cita
las
Mostrar la cita
mas
Mostrar la cita
o
Mostrar la cita
Ads by Google
Search Busqueda sugerida