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:
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.


Respuesta Responder a este mensaje
#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:
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:
> 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.
>
>


Respuesta Responder a este mensaje
#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:
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:
> 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:
> > 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.
> >
> >
>
>


Respuesta Responder a este mensaje
#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:
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:
> 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:
> > 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:
> > > 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.
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#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:
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.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida